获取列名称在DataFrame中按其值排序

时间:2016-01-31 20:56:55

标签: python sorting dictionary dataframe

我有一个庞大的数据框,我想创建一个字典。字典的键将是行的索引,值将是按该行中的值(降序)排序的数据帧的列名列表。请考虑以下示例:

df=      23    45    12     3     6
    45   0.2   1     0.12   0.5   0.1
    12   0.5   0.2   1      0.3   0.9
    23   0.1   0.9   0.3    1     0.5

我想以下列形式创建一个字典:

dict={ '45':['45','3','23','12','6'], 
       '12':['12','6','23','3','45'], 
       '23':['3','45','6','23']} 

其中值是按其行中的值排序的列名。我尝试了以下方法:

for idx,row in df.iteritems():
    l = row.values.tolist()
    l.sort(reverse=True)
    print idx,l 

但是这给了我的值而不是按降序排序的列名。任何有关如何产生所需结果的帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:2)

嗯,这似乎有效:

import numpy as np

df = pd.DataFrame({'A': [1, 3, 10, 50], 'B': [2, -8, 3, 7], 'C': [1, 10, -20, 1]})

>>> dict([(r[0], list(df.columns[np.argsort(list(r)[1: ])])) \
    for r in list(df.to_records())])
{0: ['A', 'C', 'B'],
 1: ['B', 'A', 'C'],
 2: ['C', 'B', 'A'],
 3: ['C', 'B', 'A']}

<强>解释

  • list(df.to_records())是一个行列表作为元组。
  • r[0]是元组中的第一个元素。
  • list(r)[1: ]是元组的其余部分。
  • np.argsort根据排序的值顺序返回数组的索引。
  • dict( list_of_pairs )从一组对中创建一个字典。