python / Pandas : Use lookup DataFrame + function to replace specific/null values in DataFrame

标签 python pandas 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

我设想的一种方法是使用 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/

相关文章:

python - 带 Tornado 的 Django TCP 服务器

python - 使用 Python 中 ma numpy 中的 fiil_value 将屏蔽值 (--) 替换为 Null 或 None 值

python - 艰难地学习 Python 练习 46 : Installing Python packages (pip, nose 等)在 Windows 上

python - 如何选择两列来绘制数据框?

python - 如何将日期列与日期进行比较并添加文本列?

python - 在 pandas 数据框中使用文本字符串数据进行条件数据选择

python - 在 Pandas 列中,如何找到特定值出现的最大连续行数?

python - Pandas:根据其他列值有条件地替换值

python - 使用 Python 进行 Linux 包管理

python - 如何在列表理解中使用重新匹配对象