将条件应用于不同的组

时间:2018-03-03 22:27:22

标签: python pandas

       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 valuesB values不同(它发生在红色A组中,而不是白色A组):transform D值中的

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

       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"]

3 个答案:

答案 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

答案 1 :(得分: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

答案 2 :(得分: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

希望这能解决您的问题。