在pandas DataFrame中查找行值最小的列名

3

我有一个如下的DataFrame:

X = np.array([[1.0, -20, 200, 50],
              [2.0, 19, 100, 52],
              [3.0, 17, -150, 55],
              [4.0, 20, -120, 60],
              [5.0, 21, 119, 70],
              [6.0, -15, 134, -75],
              [7.0, 9, 178, -80],
              [8.0, 10, -190, 90],
              [9.0, 19, 200, 70],
              [10.0, 20, 210, 65]])

native_id1 = ['08MB005', '08ME005', '08GD006','08GH002']
native_id2 = ['08CD001', '08EF006', '08TH002', '08LO002', '07HP003', '08IK002', '09WF001','09YU001', '05KJ008', '08LK007']
X = pd.DataFrame(X, native_id2, native_id1)

我使用了下面的函数,它返回每行中最小值所对应的列或索引位置。

idx = np.argmin(X.values, axis=1)

它返回类似以下的内容:

array([1, 0, 2, 2, 0, 3, 3, 2, 0, 0], dtype=int64)

我正在寻找的是这个:
08CD001    08ME005
08EF006    08MB005
08TH002    08GD006
08LO002    08GD006
07HP003    08MB005
08IK002    08GH002
09WF001    08GH002
09YU001    08GD006
05KJ008    08MB005
08LK007    08MB005

*已更新* 我找到了这个问题的答案,我试图找到与pandas数据帧每行最小值对应的列名。

以下答案有效:

df.idxmin(axis=1)

3
df.columns[idx] - piRSquared
1
如果你真的想要清晰明了,你应该提供一个 [mcve]。 - piRSquared
3
df.idxmin(axis=1) 的作用是获取所有列名。 - Tarifazo
2
顺便提一下,(X.idxmin(1) == X.columns[X.values.argmin(1)]).all() 的值为 True - piRSquared
2
很明显你甚至没有尝试我提供的代码。如果你尝试了,你会注意到它会给出每行最小值的列名...正是你所要求的。现在我在这个交互中既没有失去也没有获得任何东西,但我担心你会走开而不理解对你可能非常有用的东西。 - piRSquared
显示剩余16条评论
2个回答

4

使用 DataFrame.idxmin (文档):

df.idxmin(axis=1)

你可以使用 df.apply(np.argmin, axis=1) 的等价形式是np.argmin。但是你会收到以下警告:

FutureWarning: 'argmin'已过时,请改用'idxmin'。未来的 'argmin' 行为将被更正为返回位置最小值而不是值。现在请使用'series.values.argmin'来获取最小值的位置。

因此,建议使用 idxmin

1
您可以使用此代码获取所需的列:

def func(x):
    return np.argmin(x)

print(df[["Small", "Int", "Bor", "Drama"]].apply(func, axis=1))

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