根据排名值按列表元素填充数据帧

时间:2018-03-02 19:07:09

标签: python

我有一个等级值的数据帧,例如,1表示最好,5表示最差。索引是我的样本,列是功能。

输入:

  

索引A B C D E
      item1 1 4 2 3 5
  item2 2 3 4 5 1
  item3 2 5 4 3 1
  ......

我想创建一个Dataframe,根据他们的等级显示要素的元素。列是从1到5的等级,内容是特征。

输出:

  

指数1 2 3 4 5
      item1 A C D B E
  item2 E A B C D
  item3 E A D C B
  ......

1 个答案:

答案 0 :(得分:1)

以下是使用pandas的一种方式:

我不确定您的数据帧的格式是什么(csv?pandas dataframe?),但无论如何,您首先需要将您的数据帧放入pandas,如下所示:

>>> df
       A  B  C  D  E
index               
item1  1  4  2  3  5
item2  2  3  4  5  1
item3  2  5  4  3  1

然后,你可以按照你想要的方式操作它:

import pandas as pd
df_dict = df.T.to_dict()
sorted_vals = [sorted(df_dict[i], key=df_dict[i].get) for i in df_dict.keys()]
new_df=pd.DataFrame(sorted_vals,
                    index=df.index,
                    columns=list(range(1,len(df.columns)+1)))

>>> new_df
       1  2  3  4  5
index               
item1  A  C  D  B  E
item2  E  A  B  C  D
item3  E  A  D  C  B

为了引导您完成它,第一步(df.T.to_dict())会创建一个如下所示的字典:

>>> df_dict
{'item1': {'A': 1, 'B': 4, 'C': 2, 'D': 3, 'E': 5}, 'item2': {'A': 2, 'B': 3, 'C': 4, 'D': 5, 'E': 1}, 'item3': {'A': 2, 'B': 5, 'C': 4, 'D': 3, 'E': 1}}

您可以根据其值(sorted_vals = [sorted(df_dict[i], key=df_dict[i].get) for i in df_dict.keys()])对每个子词典进行排序,从而产生以下结果:

>>> sorted_vals
[['A', 'C', 'D', 'B', 'E'], ['E', 'A', 'B', 'C', 'D'], ['E', 'A', 'D', 'C', 'B']]

最后一行从列表列表中生成新数据帧,并使用1到n_ranks的范围作为列名