У меня есть 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 ...]]
Так что именно я сделал не так?
Если я правильно понял, вы хотите объединить список списков в один список, а также хотите, чтобы каждая запись в столбце функций была одинаковой длины.
Это может быть достигнуто следующим образом:
# 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)
Если я что-то не понял ясно, пожалуйста, прокомментируйте.
Моя ошибка, скопируйте и вставьте ошибку. Это должно исправить это.
Def append_zeros(k): если len(k) < max_len: вернуть k + ([-1]*(max_len - len(k))).copy() иначе: вернуть k
.append всегда возвращает None
Вы можете суммировать каждый список с пустым, чтобы получить плоский список:
DF['features'] = DF.features.apply(lambda x: sum(x, []))
Вау, это элегантно. Спасибо
Пожалуйста! Пожалуйста, рассмотрите возможность принятия одного из ответов, представленных здесь, и помните, что вы можете проголосовать за любой ответ, который, по вашему мнению, был вам полезен! Лучший!
Это хорошо, но удаляет все ячейки в функциях, у которых нет max_length.