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
不同(它发生在红色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"]
答案 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
希望这能解决您的问题。