我有这样的数据帧:
c1 c2
0 a 12
1 b NaN
2 a 45
3 c NaN
4 c 32
5 b NaN
我有像这样的字典
di = {
'a': 10, 'b': 20, 'c':30
}
我想像这个一样更新我的数据帧
c1 c2
0 a 12
1 b 20
2 a 45
3 c 30
4 c 32
5 b 20
有什么方法可以在不使用条件为
的长lambda函数的情况下实现这一点
以下是创建数据帧的代码
a = pd.DataFrame({
'c1': ['a', 'b', 'a', 'c', 'c', 'b'],
'c2': [12, np.NaN, 45, np.NaN, 32, np.NaN]
})
di = {
'a': 10, 'b': 20, 'c':30
}
di
您可以使用apply((方法来处理此问题。创建一个函数,然后将该函数应用于所需的功能。
`def deal_na(cols):
x=cols[0]
y=cols[1]
if pd.isnull(y):
return di[x]
else:
return y
a['c2'] = a[['c1','c2']].apply(deal_na,axis=1)`
在这里,我们将特征"c1"one_answers"c2"的值作为列表传递给cols变量中的函数。然后我们将每个值分配给2个变量x和y。我们检查y是否为空。如果为空,则替换为di[x],否则原样返回。
使用Series.map
和Series.fillna
仅替换缺少的值:
a['c2'] = a['c2'].fillna(a['c1'].map(di))
print (a)
c1 c2
0 a 12.0
1 b 20.0
2 a 45.0
3 c 30.0
4 c 32.0
5 b 20.0
最后,如果c1
的所有值都在字典的关键字中,则所有缺失值的值都将被替换,并且可以转换为整数:
a['c2'] = a['c2'].fillna(a['c1'].map(di)).astype(int)
print (a)
c1 c2
0 a 12
1 b 20
2 a 45
3 c 30
4 c 32
5 b 20