Python返回列名称中第二高的值

2024-03-29 10:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

数据

data = [['john', 0.20, 0.0, 0.4, 0.40],['katty', 0.0, 1.0, 0.0, 0.0],['kent', 0.0, 0.51, 0.49, 0.0]]
df = pd.DataFrame(data, columns=['name','fruit', 'vegetable', 'softdrinks', 'icecream'])
df = df.set_index('name')
df.head()

期望的结果

data = [['john', 0.20, 0.0, 0.4, 0.40,'softdrinks','icecream'],['katty', 0.0, 1.0, 0.0, 0.0,'vegetable','NaN'],['kent', 0.0, 0.51, 0.49, 0.0,'vegetable','softdrinks']]
df = pd.DataFrame(data, columns=['name','fruit', 'vegetable', 'softdrinks', 'icecream', 'max_no1', 'max_no2'])
df = df.set_index('name')
df.head()

试过idxmax里面只返回值最高的列名,我需要定位值第二高的行列名,怎么实现这个?你知道吗

多谢了


Tags: columnsnamedataframedfdataindexjohnpd
1条回答
网友
1楼 · 发布于 2024-03-29 10:28:02

首先按^{}0设置为缺失值,然后按^{}重新整形,对于top2使用^{},最后按^{}重新整形数据^{}

df1 = df.mask(df == 0).stack().groupby(level=0, group_keys=False).nlargest(2).reset_index()
df1 = df1.assign(a = df1.groupby('name').cumcount().add(1))

df = df.join(df1.pivot('name','a','level_1').add_prefix('max_no'))
print (df)
       fruit  vegetable  softdrinks  icecream     max_no1     max_no2
name                                                                 
john     0.2       0.00        0.40       0.4  softdrinks    icecream
katty    0.0       1.00        0.00       0.0   vegetable         NaN
kent     0.0       0.51        0.49       0.0   vegetable  softdrinks

或使用^{}从注释中选择解决方案,并通过与numpy中的广播比较再次设置缺少的值:

df1 = df.mask(df == 0)
df['max_no1'] = df1.idxmax(axis=1)
m = df1.columns.to_numpy() == df['max_no1'].to_numpy()[:, None]
#pandas below 0.24
#m = df1.columns.values == df['max_no1'].values[:, None]
df1 = df1.mask(m)
df['max_no2'] = df1.idxmax(axis=1)
print (df)
       fruit  vegetable  softdrinks  icecream     max_no1     max_no2
name                                                                 
john     0.2       0.00        0.40       0.4  softdrinks    icecream
katty    0.0       1.00        0.00       0.0   vegetable         NaN
kent     0.0       0.51        0.49       0.0   vegetable  softdrinks

相关问题 更多 >