将条件应用于不同的组

问题描述 投票:0回答:3
       A     B     C     D
0    Red  10.0  11.5  12.0
1    Red  10.5  11.5  12.0
2    Red  11.0  11.5  12.0
3    Red  12.0  11.5  12.0
4  White  10.0  10.5  11.0
5  White  10.5  10.5  11.0
6  White  11.0  10.5  11.0
7  White  12.0  10.5  11.0

我想为每个A组应用下一个条件:

  • 如果所有C values都不同于B values(它发生在Red A组中,而不是在White A组中):在D值中转换C.

我的意思是,结果应该是:

       A     B     C     D
0    Red  10.0  12.0  12.0
1    Red  10.5  12.0  12.0
2    Red  11.0  12.0  12.0
3    Red  12.0  12.0  12.0
4  White  10.0  10.5  11.0
5  White  10.5  10.5  11.0
6  White  11.0  10.5  11.0
7  White  12.0  10.5  11.0

我试过了:

df.loc[(df["B"] != df["C"]) & (df["B"] == df["D"]), "C"] = df["D"]
python pandas
3个回答
1
投票

您可以使用groupby,然后根据B和C之间的比较设置C.

(
    df.groupby('A')
    .apply(lambda x: x.assign(C=x.D if x.B.ne(x.C).all() else x.C))
    .reset_index(level=0,drop=True)
)
Out[41]: 
       A     B     C     D
0    Red  10.0  12.0  12.0
1    Red  10.5  12.0  12.0
2    Red  11.0  12.0  12.0
3    Red  12.0  12.0  12.0
4  White  10.0  10.5  11.0
5  White  10.5  10.5  11.0
6  White  11.0  10.5  11.0
7  White  12.0  10.5  11.0

1
投票
import numpy as np
df['C'] = df.groupby('A').apply(lambda x: x.D if np.all(x.B != x.C) else x.C).values

按列A分组。对于每个组,如果B中的所有值都与C中的值不同,则返回列D,否则返回列C

group by ... apply操作的结果是具有多级索引的系列。索引不重要,所以取值并覆盖列C


0
投票

嘿,你想在A列==“红色”时将所有值从D列复制到C列。然后

df["C"][df["A"] == "Red"] = df["D"][df["A"] == "Red"]

Output
         A        B       C      D
    0   Red     10.0    12.0    12.0
    1   Red     10.5    12.0    12.0
    2   Red     11.0    12.0    12.0
    3   Red     12.0    12.0    12.0
    4   White   10.0    10.5    11.0
    5   White   10.5    10.5    11.0
    6   White   11.0    10.5    11.0
    7   White   12.0    10.5    11.0

希望这能解决你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.