重塑熊猫表

时间:2019-09-26 20:47:23

标签: python pandas dataframe reshape

我想重塑熊猫桌子。我有一个表格的形式:

date | country |state | population | num_cars
1    | c1      | s1   | 1          | 1
2    | c1      | s1   | 1          | 1
1    | c1      | s2   | 1          | 1
.
2    | c2      | s2   | 1          | 2
2    | c2      | s2   | 1          | 2

我想把它变成这种形状:

date |1_population | c1_s1_population | c1_s2_population...| c2_s1_populationc1_num_cars |c2_11_num_cars...

为说明起见,初始数据具有按国家/地区列出的日期和地区的弹出式窗口和数字。现在,我想将每个级别(国家/地区,国家/地区)的时间序列列转换为

我该怎么做?

1 个答案:

答案 0 :(得分:1)

作为源数据样本,我使用了2个假设的DataFrame 国家,每个州3个州:

    date country state  population  num_cars
0   1990     Xxx   Aaa         100        15
1   2010     Xxx   Aaa         120        18
2   1990     Xxx   Bbb          80         9
3   2010     Xxx   Bbb          88        11
4   1990     Xxx   Ccc          75         6
5   2010     Xxx   Ccc          82         8
6   1990     Yyy   Ggg          40         5
7   2010     Yyy   Ggg          50         6
8   1990     Yyy   Hhh          30         3
9   2010     Yyy   Hhh          38         4
10  1990     Yyy   Jjj          29         3
11  2010     Yyy   Jjj          35         4

要解决您的问题,请先定义重新格式化功能:

def reformat(grp, col):
    pop = grp[col]
    pop.name = grp.date.iloc[0]
    return pop

从一组行( grp )中,选择一列具有特定名称( col )的列, 从第一行(分组键)将名称设置为 date 返回它。

第一步,将 df 国家分组:

gr = df.set_index(['country', 'state']).groupby('date')

然后计算2个DataFrame,作为重新格式化的结果(应用 对于每个感兴趣的列,每个组都具有上述功能:

df1 = gr.apply(reformat, col='population')
df2 = gr.apply(reformat, col='num_cars')

有两个部分结果,将它们合并到索引上:

pd.merge(df1, df2, left_index=True, right_index=True,
    suffixes=('_pop', '_cars'))

结果是:

country Xxx_pop         Yyy_pop         Xxx_cars         Yyy_cars        
state       Aaa Bbb Ccc     Ggg Hhh Jjj      Aaa Bbb Ccc      Ggg Hhh Jjj
date                                                                     
1990        100  80  75      40  30  29       15   9   6        5   3   3
2010        120  88  82      50  38  35       18  11   8        6   4   4

如您所见,列上的MultiIndex的最高级别是“国家/人口” 和“国家/车号”。另一级包含状态名称。

要跟踪该解决方案的工作方式,请分别执行每个步骤并检查 其结果。