为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas - 基于与另一列的交叉引用计算新值

Pandas - 基于与另一列的交叉引用计算新值

慕娘9325324 2021-12-29 18:26:22
我正在尝试计算一列中的新值,该列的值与另一列交叉引用。>>> import pandas as pd>>> df = pd.DataFrame( {"A":[0., 100., 80., 40., 0., 60.],                         "B":[12,  12,   3,  19,  3,  19]} )>>> df       A   B0    0.0  121  100.0  122   80.0   33   40.0  194    0.0   35   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   B0   0.5  121  99.5  122  79.5   33  40.0  194   0.5   35  60.0  19我尝试链接 loc、aggregate、groupby 和 mask 功能,但我没有成功。是通过 for 循环的唯一方法吗?
查看完整描述

2 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

这将起作用:


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.


可能有一种更简洁的方法来做到这一点;它让我觉得有点凌乱。


查看完整回答
反对 回复 2021-12-29
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

我找到了一个可行的解决方案,尽管可能不是最优的。我链接groupby,过滤和转换以获得所需的系列,然后替换原始数据帧中的结果。


import pandas as pd

df = pd.DataFrame( {"A":[0., 100., 80., 40., 0., 60.], 

                    "B":[12,  12,   3,  19,  3,  19]} )

u = ( df.groupby(by="B",  sort=False)

         .filter(lambda x: x.A.min() == 0, dropna=False)

         .A.transform( lambda x: (x+0.5).where(x == 0, x - 0.5) ) 

    )

df.loc[pd.notnull(u), "A"] = u

给出以下结果


print("\ninitial df\n",df,"\n\nintermediate series\n",u,"\n\nfinal result",df)


initial 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


intermediate series

 0     0.5

1    99.5

2    79.5

3     NaN

4     0.5

5     NaN

Name: A, dtype: float64


final result       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


查看完整回答
反对 回复 2021-12-29
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号