高效地使用 Pandas 进行数据转换

3

如何使用pandas和Python解决这个问题是最好的方法?

我目前有一个相对麻烦的格式的Pandas数据框,例如:

        Country      Indicator  2000  2010
0   Afghanistan            foo     1   2.5
1   Afghanistan            bar     3   4.5
2   Afghanistan            zoo     5   6.5
3       Bolivia            foo     7   8.5
4       Bolivia            bar     9  10.5
5       Bolivia            zoo    11  12.5
6      Cameroon            foo     2   1.5
7      Cameroon            bar     4   3.5
8      Cameroon            zoo     6   5.5
9       Denmark            foo     8   7.5
10      Denmark            bar    10   9.5
11      Denmark            zoo    12  11.5

说我想将此拆分为各自年份的两个独立数据框。
对于2000年:
   foo bar zoo
0   1   3   5
1   7   9   11
2   2   4   6
3   8   10  12

对于2010年:

    foo  bar   zoo
0   2.5  4.5   6.5
1   8.5  10.5  12.5
2   1.5  3.5   5.5
3   7.5  9.5   11.5

如何在pandas中以最有效的方式进行此操作?

提前感谢。


df1 = df['Indicator', '2000'].pivot(columns='Indicator', values='2000') df2 = df['Indicator', '2010'].pivot(columns='Indicator', values='2010') - arpitrathi
2个回答

4
这种转换称为“枢轴旋转”,有时也被称为“转换”或“反融合”。它非常普遍,以至于在api中有专门的功能来处理它。 (参见链接)
df_years = df.pivot(index='Country', columns='Indicator', values=['2000', '2010'])    

            2000             2010           
Indicator    bar  foo   zoo   bar  foo   zoo
Country                                     
Afghanistan  3.0  1.0   5.0   4.5  2.5   6.5
Bolivia      9.0  7.0  11.0  10.5  8.5  12.5
...

这会导致产生 多层次的列
df_years['2000']                                                                                                                                                                                    

Indicator    bar  foo   zoo
Country                    
Afghanistan  3.0  1.0   5.0
Bolivia      9.0  7.0  11.0
...

df_years['2010']                                                                                                                                                                                   

Indicator     bar  foo   zoo
Country                     
Afghanistan   4.5  2.5   6.5
Bolivia      10.5  8.5  12.5
...

你应该直接使用这些,但如果你需要平坦的数据框,可以像这样分配:
df_2000 = df_years['2000']

Indicator    bar  foo   zoo
Country                    
Afghanistan  3.0  1.0   5.0
Bolivia      9.0  7.0  11.0
...

谢谢,这个可行。很高兴知道“旋转”是一种常见的转换方式,并且可以通过 .pivot() 处理。 - juandiegodc

0

使用 pivot-table 可以让你保存一系列的标签:foo、bar、zoo。 对于2000年:

df2000 = df.pivot_table(index='Country', columns='Indicator', sort=False)['2000']

print(df2000)

Indicator    foo  bar  zoo
Country                   
Afghanistan    1    3    5
Bolivia        7    9   11
Cameroon       2    4    6
Denmark        8   10   12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接