【问题标题】:Get Column Names Sorted by their Values in a DataFrame获取按 DataFrame 中的值排序的列名
【发布时间】:2016-05-09 05:53:05
【问题描述】:

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

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 

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

【问题讨论】:

    标签: python sorting dictionary dataframe


    【解决方案1】:

    嗯,这似乎有效:

    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) 从对数组中创建字典。

    【讨论】:

    • 谢谢,您的解决方案几乎解决了我的问题。只剩下一步了..我需要按降序排列的列名,所以我必须使用np.argsort(list(r)[1: ])[::-1] 而不是np.argsort(list(r)[1: ])。感谢您的解决方案:)
    • 我还要补充一点,使用iterrows() 更快。我比较了在 14939 行 x 14939 列 int 值的 DataFame 上使用这两个函数。您只需将公式调整如下:dict([(r[0], list(df.columns[np.argsort(list(r)[1])])) for r in list(df.iterrows())]) 使用 itterrows() 大约需要 30 秒,使用 to_records() 大约需要 280 秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多