Python 如何基于其他列填充NaN/None值?
鉴于以下情况,如何基于其他行设置B行的NaN/None值?我应该使用apply吗Python 如何基于其他列填充NaN/None值?,python,pandas,Python,Pandas,鉴于以下情况,如何基于其他行设置B行的NaN/None值?我应该使用apply吗 d = [ {'A': 2, 'B': Decimal('628.00'), 'C': 1, 'D': 'blue'}, {'A': 1, 'B': None, 'C': 3, 'D': 'orange'}, {'A': 3, 'B': None, 'C': 1, 'D': 'orange'}, {'A': 2, 'B': Decimal('575.00'), 'C': 2, 'D'
d = [
{'A': 2, 'B': Decimal('628.00'), 'C': 1, 'D': 'blue'},
{'A': 1, 'B': None, 'C': 3, 'D': 'orange'},
{'A': 3, 'B': None, 'C': 1, 'D': 'orange'},
{'A': 2, 'B': Decimal('575.00'), 'C': 2, 'D': 'blue'},
{'A': 4, 'B': None, 'C': 1, 'D': 'blue'},
]
df = pd.DataFrame(d)
# Make sure types are correct
df['B'] = df['B'].astype('float')
df['C'] = df['C'].astype('int')
In : df
Out:
A B C D
0 2 628 1 blue
1 1 NaN 3 orange
2 3 NaN 1 orange
3 2 575 2 blue
4 4 NaN 1 blue
In : df.dtypes
Out:
A int64
B float64
C int64
D object
dtype: object
以下是当值为None时设置B的“规则”示例:
def make_B(c, d):
"""When B is None, the value of B depends on C and D."""
if d == 'blue':
return Decimal('1400.89') * 1 * c
elif d == 'orange':
return Decimal('2300.57') * 2 * c
raise
以下是我解决问题的方法: 我对make_B的定义如下:
def make_B(x):
if np.isnan(x['B']):
"""When B is None, the value of B depends on C and D."""
if x['D'] == 'blue':
return Decimal('1400.89') * 1 * x['C']
elif x['D'] == 'orange':
return Decimal('2300.57') * 2 * x['C']
else:
return x['B']
然后我使用apply:
df.apply(make_B,axis=1)
看来,应用是前进的方向
fillna
似乎不接受自定义函数。谢谢你的回复。我必须将其分配给df['B']
正确吗?如果我想基于其他列更改几个列的值,我可以执行类似于df['B'],df['X']=df.apply(make_B_X,axis=1)
的操作吗?