Вот два способа, как адаптировать от @ unutbu Ответит от Find names of top-n highest-value columns in each pandas dataframe row
1) Используйте Python Decorate-Sort-Undecorate с .apply(lambda ...)
в каждой строке, чтобы вставить имена столбцов, выполните np.argsort, сохраните top-n, отформатируйте ответ. (Я думаю, что это чище).
import numpy as np
# First we apply Decorate-Sort row-wise to our df...
tmp = df.apply(lambda row: sorted(zip(df.columns, row), key=lambda cv: -cv[1]), axis=1)
a b c
0 (b, 4) (a, 1) (c, 0)
1 (b, 6) (c, 4) (a, 2)
2 (c, 8) (a, 1) (b, 0)
# Slice the top-n columns within each row...
tmp = tmp.ix[:,0:nlargest]
# then your result (as a pandas DataFrame) is...
np.array(tmp)
array([[('b', 4), ('a', 1)],
[('b', 6), ('c', 4)],
[('c', 8), ('a', 1)]], dtype=object)
# ... or as a list of rows is
tmp.values.tolist()
#... and you can insert the row-indices 0,1,2 with
zip(tmp.index, tmp.values.tolist())
[(0, [('b', 4), ('a', 1), ('c', 0)]), (1, [('b', 6), ('c', 4), ('a', 2)]), (2, [('c', 8), ('a', 1), ('b', 0)])]
2) Получить матрицу topnlocs
следующим образом, а затем использовать его как переиндексации в df.columns и df.values, и объединить этот вывод.
import numpy as np
nlargest = 2
topnlocs = np.argsort(-df.values, axis=1)[:, 0:nlargest]
# ... now you can use topnlocs to reindex both into df.columns, and df.values, then reformat/combine them somehow
# however it's painful trying to apply that NumPy array of indices back to df or df.values,
См How to get away with a multidimensional index in pandas
Это гарантирует, что существует ровно три колонки и их имена 'а, б, c' или вы хотите общий ответ? – smci
Я хочу общий ответ, просто использовал три столбца ради простоты –
Возможный дубликат [Выбор верхних N столбцов для каждой строки в фрейме данных] (http://stackoverflow.com/questions/34297319/selecting-top-n -columns-for-each-row-in-data-frame) – smci