如何选择每行第二小的值并返回对应的列名?

5
我有一个包含大量整数值的列的数据框。我想返回该行第二小的值所在的列名。
我可以返回该行最小值所在的列名,这很简单:
import pandas as pd

matrix = [(22, 2, 13),
          (9, 1, 5),
          (5, 4, 3),
          (6, 3, 1),
          (1, 2, 20)]

dfObj = pd.DataFrame(matrix, index=list('abcde'), columns=list('xyz'))

minValueIndexObj = dfObj.idxmin(axis=1)
print("min values of row are at following columns :")
print(minValueIndexObj)

Out[]:
min values of row are at following columns :
a    y
b    y
c    z
d    z
e    x
dtype: object

第 a 行中,y 列的数值最小。

接下来我需要的是:

2nd min values of row are at following columns :
a    z
b    z
c    y
d    y
e    y
dtype: object

感谢您的支持。
1个回答

3

使用argsort对所有列名进行排序,返回数组:

a = dfObj.columns.values[np.argsort(dfObj.values)]
print (a)
[['y' 'z' 'x']
 ['y' 'z' 'x']
 ['z' 'y' 'x']
 ['z' 'y' 'x']
 ['x' 'y' 'z']]

然后通过索引选择'columns'并传递给Series构造函数:

print (pd.Series(a[:, 0], index=dfObj.index))
a    y
b    y
c    z
d    z
e    x
dtype: object

print (pd.Series(a[:, 1], index=dfObj.index))
a    z
b    z
c    y
d    y
e    y
dtype: object

非常感谢,这很有帮助!所以如果我想将问题列连接到数据框中,我只需要执行dfObj[2nd] = a[:,1],对吗? - Audiogott
1
@Audiogott - 是的,没错。 - jezrael
我可以再问您一个问题吗:现在我有一列带有行名称,如何将行名称与值匹配?例如,对于最低的值:a -> y; y -> 2 - Audiogott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接