python - 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 很陌生,所以有时我会有点混淆严格的索引规则......
解决方案
国际大学联盟:
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
推荐阅读
- c++ - C++:帮助理解这行代码试图做什么
- c - 有什么方法可以阻止特权程序成功执行 unlink()?
- excel - 如何在电子邮件中添加多个附件?
- reactjs - 反应 setState 和 array.push 不起作用
- java - 将存储库或服务注入 Spring 状态机 Action 和 Guard 的正确方法
- c# - 如何使用 C# 在 SQL 数据库表中的特定索引处插入一行
- clang - 使用 C++ 在独立进程中生成 LLVM-IR
- c - 在 C 中将长 shellcode 加载到内存中
- http - 重试 http 请求 RoundTrip
- reactjs - 在 Cypress 通过 npx cypress open 运行之前删除/删除屏幕截图