看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
我们在数据处理过程中,对一些非规整的数据要更进行替换,除了将见的数字和字符串,也会遇到 Python 对象(当然前者也都是),比如此案例中的空列表,我们需要进行替换。
我们构造源数据如下:
import pandas as pd
df = pd.DataFrame({'a': [[], 2, 4],
'b': ['x', 4, []]}
)
df
'''
a b
0 [] x
1 2 4
2 4 []
'''
需要将上述数据中的空列表替换为 0。
替换数据,我们一般使用 replace,但在这个例子中,它会报错:
df.replace({[]: 0})
# TypeError: unhashable type: 'list'
注意,在这里不能传入字符串 "[]"
,因为它是一个空列表,而不是一个方括号字符串。上述代码之所以会报错是因为列表是不可哈希的,不能作为字典的键。
df.replace(to_replace=[], value=0)
这种写法虽然不报错,但不起作用,因为这里的列表是需要替换的内容列表,而这里是空列表,表示不替换任何内容。
因此,我们要用 map 对所有的 DataFrame 值写一个方法判断进行替换。
当然,我们可以将所有数据转为字符串,就可以按字符串处理了。
写一个 lambda 来进行判断,替换空列表:
# 将空列表 [] 替换为 0
df.map(lambda x: 0 if x == [] else x)
'''
a b
0 0 x
1 2 4
2 4 0
'''
将所有数据转为字符串,就可以处理了:
# 以下两种方法效果相同
df.mask(df.astype(str) == '[]', 0)
df.mask(df.astype(str).eq('[]'), 0)
如果,要替换只要是列表(不只是空列表)的值,可以用以下方法:
df.mask(df.map(type).eq(list), 0)
这样就完成了需求。
(完)
更新时间:2024-08-18 16:21:42 标签:pandas python 替换 列表