【问题标题】:How to replace an empty dict with a values in pandas如何用熊猫中的值替换空字典
【发布时间】:2020-11-30 03:58:50
【问题描述】:
我有以下几点:
pd.DataFrame({
'a' : { 1 : {}},
'b' : {1 : 3}
})
看起来像:
a b
1 {} 3
并且希望能够用 0 或 NaN 替换 {},但我不知道该怎么做。我好像不能用.replace
pd.DataFrame({
'a' : { 1 : {}},
'b' : {1 : 3}
}).replace({ {} : 0})
报错
【问题讨论】:
标签:
python
pandas
data-manipulation
data-cleaning
【解决方案1】:
你可以使用 bool ,当有空 dict 时它会返回 False
df=df.where(df.astype(bool),0)
df
Out[26]:
a b
1 0 3
【解决方案2】:
你可以这样做:
df = pd.DataFrame({
'a' : { 1 : {}},
'b' : {1 : 3}
})
df.applymap((lambda x: 0 if x == {} else x))
【解决方案3】:
这个:
pd.DataFrame({
'a' : { 1 : {}},
'b' : {1 : 3}
}).replace({ {} : 0})
导致错误,因为dict 的密钥必须是可散列的 - {} 不是。在这种情况下,您可以使用 pandas.DataFrame.replace 和两个长度相等的 lists,方法如下:
import pandas as pd
df = pd.DataFrame({
'a' : { 1 : {}},
'b' : {1 : 3}
}).replace([{}],[0])
print(df)
输出:
a b
1 0 3
【解决方案4】:
由于字典不可散列,.replace 无法作用于其中,但 pandas 具有处理可迭代对象的功能:.explode
print(df.explode('a'))
a b
1 NaN 3
如果字典不是为空,而是从 0 开始的连续整数键 (0, 1, n-1),它仍然可以工作:
df = pd.DataFrame({
'a' : {1 : {0: 'row0', 1: 'row1'}},
'b' : {1 : 3}
})
print(df.explode('a'))
a b
1 row0 3
1 row1 3
如果字典不为空或者键不是严格连续的并且从 0 开始(例如 {2: val, 'string_key':val, -1:val} 将导致爆炸失败),它将引发异常到所有三个键)