假设我在 Pandas DataFrame 中有一个不完整的数据集,例如:
incData = pd.DataFrame({'comp': ['A']*3 + ['B']*5 + ['C']*4,
'x': [1,2,3] + [1,2,3,4,5] + [1,2,3,4],
'y': [3,None,7] + [1,4,7,None,None] + [4,None,2,1]})
还有一个带有拟合参数的 DataFrame,我可以用它来填补漏洞:
fitTable = pd.DataFrame({'slope': [2,3,-1],
'intercept': [1,-2,5]},
index=['A','B','C'])
我想仅对 None 条目使用 y=x*slope+intercept 来实现以下目标:
comp x y
0 A 1 3.0
1 A 2 5.0
2 A 3 7.0
3 B 1 1.0
4 B 2 4.0
5 B 3 7.0
6 B 4 10.0
7 B 5 13.0
8 C 1 4.0
9 C 2 3.0
10 C 3 2.0
11 C 4 1.0
我设想的一种方法是使用 join 和 drop:
incData = incData.join(fitTable,on='comp')
incData.loc[incData['y'].isnull(),'y'] = incData[incData['y'].isnull()]['x']*\
incData[incData['y'].isnull()]['slope']+\
incData[incData['y'].isnull()]['intercept']
incData.drop(['slope','intercept'], axis=1, inplace=True)
但是,这似乎不是很有效,因为它会添加和删除列。似乎我把它弄得太复杂了,我是否忽略了一个简单的更直接的解决方案?更像是这个非功能性代码:
incData.loc[incData['y'].isnull(),'y'] = incData[incData['y'].isnull()]['x']*\
fitTable[incData[incData['y'].isnull()]['comp']]['slope']+\
fitTable[incData[incData['y'].isnull()]['comp']]['intercept']
我对 Pandas 还很陌生,所以有时我会对严格的索引规则有点混淆......
最佳答案
您可以使用 map
在列 'comp' 上,在 'y' 中使用空值掩码一次,例如:
mask = incData['y'].isna()
incData.loc[mask, 'y'] = incData.loc[mask, 'x']*\
incData.loc[mask,'comp'].map(fitTable['slope']) +\
incData.loc[mask,'comp'].map(fitTable['intercept'])
和你的非功能性代码,我想它会是这样的:
incData.loc[mask,'y'] = incData.loc[mask, 'x']*\
fitTable.loc[incData.loc[mask, 'comp'],'slope'].to_numpy()+\
fitTable.loc[incData.loc[mask, 'comp'],'intercept'].to_numpy()
关于 python / Pandas : Use lookup DataFrame + function to replace specific/null values in DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61108566/