我有一张这样的桌子
uid|store_1_@_A|store_2_%_7_B|store_3_&_9_C
---------------------------------------
1 |3 |4 |5
2 |20 |1 |9
3 |4 |88 |49
我想像这样形成一个新表:
uid|store_1_@_A|store_2_%_7_B|store_3_&_9_C|favorite_store
------------------------------------------------------
1 |3 |4 |5 |C
2 |20 |1 |9 |A
3 |4 |88 |49 |B
favorite_store
是一个新变量。对于每个uid,请检查三个存储的值,然后找到一个值最高的存储,例如:uid = 1,最大值= 5,属于store_3 _&_ 9_C,所以favorite_store = C
。
df = pd.DataFrame({'uid':[1,2,3],
'store_1_@_A':[3,20,4],
'store_2_%_7_B':[4,1,88],
'store_3_&_9_C':[5,9,49]})
我使用df.iloc[0].max()
来获取第一行的最大值,但我不知道如何进行。
如果要获取商店名称中的最后一个字符,我正在考虑使用最后一个'_'。例如re.findall('[^\_]+$', 're.findall('[^\_]+$', 'store_3_A')[0]')[0]
可能有效。
答案 0 :(得分:2)
使用idxmax
:
df['favorite_store'] = df.idxmax(axis=1)
答案 1 :(得分:1)
尝试一下:
df['favorite_store'] = df.T.idxmax()
In [5248]: df
Out[5248]:
uid store_1 store_2 store_3 favorite_store
0 1 3 4 5 store_3
1 2 20 1 9 store_1
2 3 4 88 49 store_2
or
df['favorite_store'] = df.T.idxmax().str.extract(r'store_(\d+)')
In [5266]: df
Out[5266]:
uid store_1 store_2 store_3 favorite_store
0 1 3 4 5 3
1 2 20 1 9 1
2 3 4 88 49 2
答案 2 :(得分:0)
尝试一下:
import pandas as pd
df = pd.DataFrame({'uid':[1,2,3],
'store_1':[3,20,4],
'store_2':[4,1,88],
'store_3':[5,9,49]})
fav_full = (df.idxmax(axis=1))
fav_value = []
for ele in fav_full:
fav_value.append(ele[6:])
df['Favourite column'] = (fav_value)
print (df)
必须有一种更清洁的方法来执行此操作。但是,如果您所有的“商店”标头都采用以下格式,则该方法将起作用:store_x