我有一个如下数据框:
df
id d1 d2 d3 a1 a2 a3
0 474 0.000243 0.000243 0.001395 bank bank atm
1 964 0.000239 0.000239 0.000899 bank bank bank
2 4823 0.000472 0.000472 0.000834 fuel fuel fuel
3 7225 0.002818 0.002818 0.023900 bank bank fuel
4 7747 0.001036 0.001036 0.001415 dentist dentist bank
我想在d1
,d2
和d3
以及相应的a1
,a2
或a3
之间选择最小值。
df
id d a
0 474 0.000243 bank
1 964 0.000239 bank
2 4823 0.000472 fuel
3 7225 0.002818 bank
4 7747 0.001036 dentist
如果d
的列数相同,而a
和数字的列数相同,则可以相互映射:
df1 = df.filter(regex='d\d+')
df2 = df.filter(regex='a\d+')
pos = df1.idxmin(axis=1).map(dict(zip(df1.columns, df2.columns)))
df = df[['id']].assign(d = df1.min(axis=1), a = df.lookup(df.index, pos))
print (df)
id d a
0 474 0.000243 bank
1 964 0.000239 bank
2 4823 0.000472 fuel
3 7225 0.002818 bank
4 7747 0.001036 dentist
您可以在此处使用pd.wide_to_long
来获取long格式的数据帧,并指定pd.wide_to_long
作为存根名称。然后gruopby [d,a]
和id
的idxmin
上的索引:
idxmin