熊猫fillna到空字典

时间:2019-05-20 14:18:34

标签: python pandas

我有一个带有“元数据”列的熊猫数据框,其中应包含一个字典作为值。但是,缺少某些值并将其设置为NaN。我希望改为{}。 有时,整列都丢失了,将其初始化为{}也是有问题的。

用于添加列

tspd['metadata'] = {} # fails
tspd['metadata'] = [{} for _ in tspd.index] # works

用于填充缺失值

tspd['metadata'].replace(np.nan,{}) # does nothing
tspd['metadata'].fillna({})  # likewise does nothing
tspd.loc[tspd['metadata'].isna(), 'metadata'] = {} # error
tspd['metadata'] = tspd['metadata'].where(~tspd['metadata'].isna(), other={}) # this sets the NaN values to <built-in method values of dict object>

因此添加列是可行的,但是有点麻烦。似乎不可能不经过(缓慢)循环就替换值。

2 个答案:

答案 0 :(得分:3)

您可以使用np.nan == np.nanFalse,因此可以使用以下方法替换丢失的值:

tspd = pd.DataFrame({'a': [0,1,2], 'metadata':[{'a':'s'}, np.nan, {'d':'e'}]})

tspd['metadata'] = tspd['metadata'].apply(lambda x: {} if x != x else x)
print(tspd)

   a    metadata
0  0  {'a': 's'}
1  1          {}
2  2  {'d': 'e'}

或者:

tspd['metadata'] = [{} if x != x else x for x in tspd['metadata']]

答案 1 :(得分:1)

请勿使用[{}] * len(tspd)

tspd['metadata'] = [{}for x in range(len(tspd))]
tspd
Out[326]: 
   a metadata
0  0       {}
1  1       {}
2  2       {}

详细信息

tspd['metadata'] = [{}] * len(tspd)
tspd['metadata'].iloc[0]['lll']=1
tspd # see all duplicated here ,since they are the same copy 
Out[324]: 
   a    metadata
0  0  {'lll': 1}
1  1  {'lll': 1}
2  2  {'lll': 1}

一个接一个地做,每次创建iid {}

tspd['metadata'] = [{}for x in range(len(tspd))]
tspd
Out[326]: 
   a metadata
0  0       {}
1  1       {}
2  2       {}
tspd['metadata'].iloc[0]['lll']=1
tspd
Out[328]: 
   a    metadata
0  0  {'lll': 1}
1  1          {}
2  2          {}