#python #pandas #flatten
#python #панды #сгладить
Вопрос:
Вероятно, это очень очевидный вопрос, но у меня есть столбец, содержащий списки, которые я пытаюсь сгладить: т.е. [AB, CD] -> AB, CD
Пример фрейма данных:
data = [
["ABC", ["AB", "AB", "EF"]],
["DEF", ["CD", "EF"]],
["GHI", ["JK"]],
[
"JKL",
np.nan,
],
]
df = pd.DataFrame(data, columns=["ID", "list"])
df
Я применяю эту функцию к указанному столбцу:
def func(string):
flattened_string = ", ".join(map(str, string))
return flattened_string
df = df["list_column"].apply(func)
Однако есть несколько строк, содержащих NaN
значения, которые инициируют ошибку "TypeError: 'float' object is not iterable"
. Могу ли я каким-либо образом изменить эту функцию, чтобы исправить это? Или, возможно (вероятно), гораздо лучший способ сделать это?
Спасибо!!!
Ответ №1:
Вам нужно заполнить NaN
s в этом столбце чем-то пустым, но повторяющимся, например ""
, или []
. Вы также можете упростить свою функцию до простого .apply(", ".join)
, предполагая, что столбец списков, к которым вы присоединяетесь, представляет собой только строки.
df["list"] = df["list"].fillna("").apply(", ".join)
Комментарии:
1. Одно слово. умный 1
2. вау, я действительно усложнил это. Спасибо!!!
3. Наконец-то под вашим радаром появился ответ Pandas Corralien: D
Ответ №2:
Если необходимо сохранить NaN
значения в столбце, мы можем использовать параметр с расширением, только объединив notna
значения в столбце и присвоив обратно:
df['list'] = df.loc[df['list'].notnull(), 'list'].map(','.join)
Или если в списках есть нестроки:
df['list'] = df.loc[
df['list'].notnull(), 'list'
].map(lambda x: ','.join(map(str, x)))
df
:
ID list
0 ABC AB,AB,EF
1 DEF CD,EF
2 GHI JK
3 JKL NaN # Still NaN not empty string