在pandas dataframe中查找最大值的索引和列名
我有一个包含五列五行的Python数据表(dataframe),我想找到最大三个值的行和列名称。
举个例子:
df =
A B C D E F
1 00 01 02 03 04 05
2 06 07 08 09 10 11
3 12 13 14 15 16 17
4 18 19 20 21 22 23
5 24 25 26 27 28 29
输出结果可能会显示类似这样的内容:
[5,F],[5,E],[5,D]
2 个回答
0
我不会假装这是解决这个问题的最有效方法,但我觉得值得提一下:
df
A B C D E F
1 0 1 2 3 4 5
2 6 7 8 9 10 11
3 12 13 14 15 16 17
4 18 19 20 21 22 23
5 24 25 26 27 28 29
使用 df.max()
来获取每一列的最大值,然后对这些值进行排序,找出最大的数字。接着,将这些最大值与原始的 df 进行对比,返回对应的值。最后,可以使用列表推导式来获取这些值的索引:
df_2 = df[df.max().sort_values(ascending=True).tail(3).eq(df)]
[(i, df_2[i].first_valid_index()) for i in df_2.columns if df_2[i].first_valid_index() != None]
输出:
[('D', 5), ('E', 5), ('F', 5)]
或者
s = df_2.apply(pd.Series.first_valid_index).dropna()
list(zip(s.index, s.astype(int)))
输出:
[('D', 5), ('E', 5), ('F', 5)]
6
你可以在排序之前使用 unstack
:
>>> df
A B C D E F
1 0 1 2 3 4 5
2 6 7 8 9 10 11
3 12 13 14 15 16 17
4 18 19 20 21 22 23
5 24 25 26 27 28 29
>>> df.unstack()
A 1 0
2 6
3 12
4 18
5 24
B 1 1
2 7
3 13
4 19
5 25
[...]
F 1 5
2 11
3 17
4 23
5 29
还有其他方法
>>> df2 = df.unstack().copy()
>>> df2.sort()
>>> df2[-3:]
D 5 27
E 5 28
F 5 29
>>> df2[-3:].index
MultiIndex
[(D, 5.0), (E, 5.0), (F, 5.0)]
甚至可以这样做
>>> df.unstack()[df.unstack().argsort()].index[-3:]
MultiIndex
[(D, 5.0), (E, 5.0), (F, 5.0)]
[我没去反转顺序:在最后加上 [::-1]
就可以了。]