Сгладить списки списка для каждой ячейки в столбце pandas

У меня есть DF, который выглядит так

DF =
index  goal   features
  0     1    [[5.20281045, 5.3353545, 7.343434, ...],[2.33435, 4.2133, ...], ...]]
  1     0    [[7.23123213, 1.2323123, 2.232133, ...],[1,45456, 0.2313, 2.23213], ...]]
  ...

Столбец функций имеет очень большое количество чисел в списке списков. Фактическое количество его элементов неодинаково в нескольких строках, и поэтому я хотел заполнить 0, чтобы создать единый ввод, а также свести список списков к одному списку.

DF_Desired
index   goal  features
  0      1    [5.20281045, 5.3353545, 7.343434, ..., 2.33435, 4.2133, ... , ...]
  0      0    [7.23123213, 1.2323123, 2.232133, ..., 1,45456, 0.2313, 2.23213, ...]

Вот мой код:

# Flatten each Lists
flat_list = []
for sublist in data["features"]:
    for item in sublist:
        flat_list.append(item)

or

flat_list = list(itertools.chain.from_iterable(data["features"]))

Я (конечно) не могу ввести flat_list прямо в DF, так как его длина не совпадает «ValueError: длина значений (478) не соответствует длине индекса (2)»

# Make the Lists equal in length:
length = max(map(len, df["features"]))
X = np.array([xi+[0]*(length-len(xi)) for xi in df["features"])
print(X)

Это должно сделать каждую ячейку df["features"] в один список, а затем добавить 0, чтобы соответствовать каждому списку, где это необходимо. Но он просто возвращает:

[[5.20281045, 5.3353545, 7.343434, ...]
[2.33435, 4.2133, ...]
[...]
...
[7.23123213, 1.2323123, 2.232133, ...]
[1,45456, 0.2313, 2.23213 ...]]

Так что именно я сделал не так?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 124
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если я правильно понял, вы хотите объединить список списков в один список, а также хотите, чтобы каждая запись в столбце функций была одинаковой длины.

Это может быть достигнуто следующим образом:

# flattening
df.features = df.features.apply(lambda x:[leaf for tree in x for leaf in tree])

# make equal in length
max_len = df.features.apply(len).max()

def append_zeros(l):
if len(l) < max_len:
    return l.append([0]*(max_len - len(l))).copy()
else:
    return l

df.features = df.features.apply(append_zeros)

Если я что-то не понял ясно, пожалуйста, прокомментируйте.

Это хорошо, но удаляет все ячейки в функциях, у которых нет max_length.

Ron 20.12.2020 21:21

Моя ошибка, скопируйте и вставьте ошибку. Это должно исправить это.

quest 20.12.2020 21:27

Def append_zeros(k): если len(k) < max_len: вернуть k + ([-1]*(max_len - len(k))).copy() иначе: вернуть k

Ron 21.12.2020 01:42

.append всегда возвращает None

Ron 21.12.2020 01:42
Ответ принят как подходящий

Вы можете суммировать каждый список с пустым, чтобы получить плоский список:

DF['features'] = DF.features.apply(lambda x: sum(x, []))

Вау, это элегантно. Спасибо

quest 20.12.2020 21:40

Пожалуйста! Пожалуйста, рассмотрите возможность принятия одного из ответов, представленных здесь, и помните, что вы можете проголосовать за любой ответ, который, по вашему мнению, был вам полезен! Лучший!

Cainã Max Couto-Silva 20.12.2020 22:15

Другие вопросы по теме