排序值的字典在转换为pandas数据帧时会被取消排序

时间:2015-03-07 12:46:51

标签: pandas

我正在阅读一份csv文件,其中包括1940年至2004年墨西哥32个州的国内生产总值。这些列是州名和每年的GDP值。

不幸的是,我现在无法添加图像...但是,基本上,数据框具有如下列:state_name,1940,1950等... state_name的值是每个州的名称(如字符串),其余列的值是每年每个州的GDP。

所以,我正在尝试生成一个新的数据帧,其中不再有state_names列,而只有列1940,1950等......其中值不再是相应的GDP,而是根据状态的名称在给定的一年中达到GDP。因此,新数据框中的第1940列将列出不按字母顺序排列的状态,就像我当前的输出那样,但是通过GDP的排序(就像我在循环中生成的那样,在下面创建字典)。

我使用以下循环(在状态中)按年(1940年至2004年)对整个数据框进行排序,然后切片此排序数据框的名称(名称中)。

ranks = {} 
for year in pibe.columns.values[1:]:
    states = pibe.sort(columns=year, ascending=False)
    names = states["entidad"]
    ranks[year] = names

此词典的输出如下所示:

{'1940': 1         Baja California
22           Quintana Roo
8        Distrito Federal
9                 Durango
21              Queretaro
0          Aguascalientes
2     Baja California Sur
...
Name: entidad, dtype: object, 
'1950': 22           Quintana Roo
1         Baja California
8        Distrito Federal
2     Baja California Sur
5     Chihuahua...}

这么好。但是,当我尝试将字典转换为数据框时,它会以某种方式覆盖我之前的排序并检索按字母顺序排列的状态名称列表。因此,新数据框每年都有一列用相同的名称列表填充。

将字典转换为我正在使用的数据框:

pd.DataFrame(ranks)

1 个答案:

答案 0 :(得分:0)

根据您需要的顺序创建新的数据框:

In [6]: ordered_df = original_df.sort(['Year','GDP'],axis=0,ascending=False)

创建一个新字典以传递到最终数据框(这可以更有效地完成):

In [7]: unique_years = {item[1]['Year']:[] for item in ordered_df.iterrows()}

循环填充字典的新数据框:

In [8]: for row in ordered_df.iterrows():
            unique_years[row[1]['Year']].append(row[1]['State'])

创建最终数据框:

In [9]: final_df = pd.DataFrame(unique_years)

输入:

In [11]: original_df
Out[11]: 
    Year       State  GDP
0   1945    New York   84
1   1945       Texas   38
2   1945  California   84
3   1946    New York   56
4   1946       Texas    6
5   1946  California   84
6   1947    New York   75
7   1947       Texas   95
8   1947  California   92
9   1948    New York   50
10  1948       Texas   25
11  1948  California   30
12  1949    New York   16
13  1949       Texas   33
14  1949  California   31
15  1950    New York   37
16  1950       Texas   75
17  1950  California   49
18  1951    New York   28
19  1951       Texas   74
20  1951  California   78
21  1952    New York   57
22  1952       Texas    5
23  1952  California   28

输出:

In [12]: final_df
Out[12]: 
         1945        1946        1947        1948        1949        1950  \
0    New York  California       Texas    New York       Texas       Texas   
1  California    New York  California  California  California  California   
2       Texas       Texas    New York       Texas    New York    New York   

         1951        1952  
0  California    New York  
1       Texas  California  
2    New York       Texas  

根据有序数据框检查最终数据框,以确保正确的GDP排序:

In [13]: ordered_df
Out[13]: 
    Year       State  GDP
21  1952    New York   57
23  1952  California   28
22  1952       Texas    5
20  1951  California   78
19  1951       Texas   74
18  1951    New York   28
16  1950       Texas   75
17  1950  California   49
15  1950    New York   37
13  1949       Texas   33
14  1949  California   31
12  1949    New York   16
9   1948    New York   50
11  1948  California   30
10  1948       Texas   25
7   1947       Texas   95
8   1947  California   92
6   1947    New York   75
5   1946  California   84
3   1946    New York   56
4   1946       Texas    6
0   1945    New York   84
2   1945  California   84
1   1945       Texas   38