扩展Pandas数据帧,类似于Pivot或Stack / Unstack

时间:2014-03-10 11:11:10

标签: python numpy pandas

我的问题最好用一个例子来解释:

我有什么:

ID0,ID1,Time,Data0,Data1
 1   1   10  'A'    93
 1   2   10  'A'    55
 1   1   12  'A'    88
 1   2   12  'B'    66
 2   3   102 'C'    14
 2   4   102 'A'    22
 2   4   112 'D'    15
 2   3   112 'B'    43

我想要的是什么:

ID0,ID1,Time,Data0,Data1,Data0.2,Data1.2
 1   1   10   'A'    93    'A'    55
 1   2   10   'A'    55    'A'    93
 1   1   12   'A'    88    'B'    66
 1   2   12   'B'    66    'A'    88
 2   3   102  'C'    14    'A'    22
 2   4   102  'A'    22    'C'    14
 2   4   112  'D'    15    'B'    43
 2   3   112  'B'    43    'D'    15

基本上,每个ID0都有2个唯一的ID1。

定期对数据进行采样。

我想通过添加更多列来使原始数据框“更宽”,以便每行包含来自同一时间段内其他ID1的信息。

1 个答案:

答案 0 :(得分:3)

尝试:

grb = df.groupby(['ID0', 'Time'])
df['Data0.2'] = grb['Data0'].transform(lambda ts: ts[::-1])
df['Data1.2'] = grb['Data1'].transform(lambda ts: ts[::-1])

这基本上是做什么的,基于你的陈述

  

每个ID0都有2个唯一的ID1。

它按['ID0', 'Time']对数据框进行分组并反转特定列;如果每个组中只有2个唯一ID1s,则数据框将按其他ID1的值进行扩展;

>>> df
   ID0  ID1  Time Data0  Data1 Data0.2  Data1.2
0    1    1    10   'A'     93     'A'       55
1    1    2    10   'A'     55     'A'       93
2    1    1    12   'A'     88     'B'       66
3    1    2    12   'B'     66     'A'       88
4    2    3   102   'C'     14     'A'       22
5    2    4   102   'A'     22     'C'       14
6    2    4   112   'D'     15     'B'       43
7    2    3   112   'B'     43     'D'       15

[8 rows x 7 columns]

最终修改:要同时执行这两个列,您可以尝试下面;请注意,此处需要.values

>>> grb = df.groupby(['ID0', 'Time'])
>>> df2 = grb['Data0', 'Data1'].transform(lambda obj: obj.values[::-1])
>>> df.join(df2, rsuffix='.2')