首页 > 解决方案 > Python/Pandas:使用查找 DataFrame + 函数替换 DataFrame 中的特定/空值

问题描述

假设我在 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

我设想的一种方法是使用加入和删除:

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 很陌生,所以有时我会有点混淆严格的索引规则......

标签: pythonpandasdataframe

解决方案


国际大学联盟:

incData.loc[pd.isna(incData['y']), 'y'] = incData[pd.isna(incData['y'])].apply(lambda row: row['x']*fitTable.loc[row['comp'], 'slope']+fitTable.loc[row['comp'], 'intercept'], axis=1)

incData
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


推荐阅读