Почему вы не можете заменить целые числа списками с помощью метода `replace` - pandas - PullRequest
0 голосов
/ 21 ноября 2018

Итак, допустим, у меня есть фрейм данных панд, как показано ниже:

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 []

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Здесь есть две проблемы.Во-первых, это причудливость панд при работе со списками.Чтобы заменить значения в 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]]
0 голосов
/ 21 ноября 2018

Это возможно при понимании списка, но поскольку смешанный контент - числовой со списком, не рекомендуется:

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  []
...