Итак, скажем, у меня есть кадр данных pandas, как показано ниже:
df=pd.DataFrame({'a':[1,2,3,0]})
Поэтому моя цель - заменить значение 0
на []
(пустой список) в этом кадре данных, но я сделал:
print(df.replace(0,[]))
Но это дает мне ошибку:
TypeError: Invalid "to_replace" type: 'int'
Я пробовал все, что возможно, то есть:
df[df==0]=[]
так далее...
Но ничего не работает.
Желаемый результат (в случае путаницы):
a
0 1
1 2
2 3
3 []
Всего 3 ответа
Это возможно по усмотрению списка, но поскольку смешанный контент - числовой со списком не рекомендуется:
df['a'] = [[] if x == 0 else x for x in df.a]
print (df)
a
0 1
1 2
2 3
3 []
И замените все значения во всех столбцах:
df = df.applymap(lambda x: [] if x == 0 else x)
print (df)
a
0 1
1 2
2 3
3 []
Здесь есть два вопроса. Во-первых, это причуда панд при работе со списками. Чтобы заменить значения в списке DataFrame, вам нужно сделать что-то подобное;
df.loc[df.a == 0, "a"] = [[] for _ in df[df.a == 0]]
Это создает n
пустой список, основанный на количестве элементов, соответствующих критериям ( df == 0
)
Вторая проблема заключается в том, что ваш столбец имеет целочисленный тип, и вы не можете сохранить список в столбце целых чисел. Поэтому, прежде чем вы сможете назначить список, сначала нужно сначала преобразовать тип столбца в объект.
df = df.astype(object)
df.loc[df.a == 0, "a"] = [[] for _ in df[df.a == 0]]
Это работает для меня:
df=pd.DataFrame({'a':[1,8,3,0]})
print(df)
a
0 1
1 8
2 3
3 0
df['a'] = df['a'].apply(lambda d: d if d!=0 else [])
print(df)
a
0 1
1 8
2 3
3 []