python - Pandas - 基于与另一列的交叉引用计算新值
问题描述
我正在尝试计算其值与另一列交叉引用的列中的新值。
>>> import pandas as pd
>>> df = pd.DataFrame( {"A":[0., 100., 80., 40., 0., 60.],
"B":[12, 12, 3, 19, 3, 19]} )
>>> df
A B
0 0.0 12
1 100.0 12
2 80.0 3
3 40.0 19
4 0.0 3
5 60.0 19
我想在 A 列中找到所有为 0 的值,在 B 列中找出相应的值,然后根据某个函数更改具有相同 B 列值的所有 A 列值。例如,在上面的示例中,我想将 A 列的前两个值df.A[0]
和df.A[1]
0. 和 100. 分别更改为 0.5 和 99.5,因为df.A[0]
是 0. 并且它df.B[0] = 12
在 B 列中的值与df.B[1] = 12
.
df
A B
0 0.5 12
1 99.5 12
2 79.5 3
3 40.0 19
4 0.5 3
5 60.0 19
我尝试链接 loc、aggregate、groupby 和 mask 功能,但我没有成功。是通过for循环的唯一方法吗?
编辑:扩大示例以更好地说明意图。
解决方案
这将起作用:
import pandas as pd
df = pd.DataFrame( {"A":[0., 100., 40., 60.], "B":[12, 12, 19, 19]} )
def f(series):
return (series + 0.5).where(series == 0, series - 0.5)
B_value = df.loc[df['A'] == 0, 'B'][0]
df.loc[df['B'] == B_value, 'A'] = df.loc[df['B'] == B_value, 'A'].transform(f)
print(df)
输出:
A B
0 0.5 12
1 99.5 12
2 40.0 19
3 60.0 19
您可以将任意函数传递给transform
.
可能有一种更清洁的方法来做到这一点;它让我觉得有点凌乱。
推荐阅读
- http - 路由器返回 404 编码斜线 (%2F)
- anylogic - Java 应用程序调用 Anylogic(无导出)
- javascript - 如何修复我的进度条出现故障?
- python - Pygame以与玩家相同的方式移动绘制的矩形(不是图像),包括旋转
- python - Python - 如何使用字典正确绘制折线图?
- python - 你如何在 Pandas 中创建组合滚动组
- c++ - 将当前模板用作模板参数之一的模板参数
- python-3.x - 使用 wtforms 进行烧瓶网格编辑
- class - R:读取数据表时指定列类的目的
- ansible - Ansible 从字典中选择和组合属性