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"]
您可以使用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
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
。
嘿,你想在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
希望这能解决你的问题。