我有 df:
import pandas as pd
data = {"id_1":["a","b","c"],
"id_2":["q","w","e"],
"val_1":[1,2,3],
"val_2":[2,0,0]}
df = pd.DataFrame(data)
# id_1 id_2 val_1 val_2
# 0 a q 1 2
# 1 b w 2 0
# 2 c e 3 0
val_1
我想比较和val_2
列的值。如果val_1
大于val_2
(它们永远不会相同),我想用的值填充新列id_1
,否则用的值填充新列id_2
。要创建:
id_1 id_2 val_1 val_2 max_id
0 a q 1 2 q
1 b w 2 0 b
2 c e 3 0 c
max_id
第一行是 q 因为val_2>val_1
......
我可以通过以下方式获得最大值:
df[["val_1", "val_2"]].max(axis=1)
并从中获取 ID 的列名:
index_map = {0:"id_1", 1:"id_2"}
df.apply(lambda x: [x.val_1, x.val_2].index(max([x.val_1, x.val_2])), axis=1).map(index_map)
# 0 id_2
# 1 id_1
# 2 id_1
但后来我的想法就消失了。
由于您有两列,因此一种简单的方法是使用
where
:如果您想要推广到任意数量的 id /值对,您可以组合
idxmax
并索引查找:或者使用
wide_to_long
:或者,如果列已经按正确顺序排序(1,2,3 ...; 1,2,3 ...),使用numpy:
输出:
中间体: