我的问题最好用一个例子来解释:
我有什么:
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的信息。
答案 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')