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

#python #pandas

#python #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], ...]]
  ...
 

Столбец features содержит очень большое количество чисел в списке списков. Фактическое количество его элементов неодинаково в нескольких строках, и поэтому я хотел заполнить 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, поскольку его длина не соответствует
«Ошибка значения: длина значений (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 ...]]
 

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

Ответ №1:

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

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

Комментарии:

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

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

Ответ №2:

Если я правильно понял, вы хотите сгладить список списков в один список, а также хотите, чтобы каждая запись в столбце features имела одинаковую длину.

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

 # 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)
 

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

Комментарии:

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

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

3. def append_zeros(k): если len(k) <max_len: возвращает k ([-1]*(max_len — len(k))).copy() else: возвращает k

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