#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