我真的不确定如何表达我的问题,从而说出我的问题。当然这是一个众所周知的问题,但我找不到如何解决它。
我有一个像这样的数据框
id time value
0 100 2012-04-01 2.3
1 100 2012-04-02 3.4
2 100 2012-04-03 1.4
3 100 2012-04-04 5.6
4 200 2012-04-01 3.0
5 200 2012-04-02 2.9
6 200 2012-04-03 2.8
7 200 2012-04-04 1.9
8 300 2012-04-01 3.1
9 300 2012-04-02 4.2
10 300 2012-04-03 2.5
11 300 2012-04-04 1.2
我有一个定义某些时间序列的唯一ID列表。在这种情况下,我有3个时间序列,即时间序列100,时间序列200,时间序列300.这些时间序列中的每一个对于每个日期都有一个值。 (请注意,它们都始于2012-04-01,并且都在2012-04-04结束,所以它们都在同一时期。)
我想要做的是快速将上述内容转换为类似
的内容 time 100 200 300
0 2012-04-01 2.3 3.0 3.1
1 2012-04-02 3.4 2.9 4.2
2 2012-04-03 1.4 2.8 2.5
3 2012-04-04 5.6 1.9 1.2
甚至更好的时间作为索引
time 100 200 300
2012-04-01 2.3 3.0 3.1
2012-04-02 3.4 2.9 4.2
2012-04-03 1.4 2.8 2.5
2012-04-04 5.6 1.9 1.2
MY TRY
假设数据框名为df
。
list_dfs = []
for i in somedf['id'].unique():
list_dfs.append(somedf[somedf['id'] == i].set_index('time').drop('id', axis = 1).rename(columns={'value':i}))
通过这样做,我可以使用pd.concat
,但问题是它弄乱了索引
pd.concat(list_dfs)
我得到了
100 200 300
time
2012-04-01 2.3 NaN NaN
2012-04-02 3.4 NaN NaN
2012-04-03 1.4 NaN NaN
2012-04-04 5.6 NaN NaN
2012-04-01 NaN 3.0 NaN
2012-04-02 NaN 2.9 NaN
2012-04-03 NaN 2.8 NaN
2012-04-04 NaN 1.9 NaN
2012-04-01 NaN NaN 3.1
2012-04-02 NaN NaN 4.2
2012-04-03 NaN NaN 2.5
2012-04-04 NaN NaN 1.2
为MWE生成df的代码
df = pd.DataFrame({'id':[100,100,100,100,200,200,200,200,300,300,300,300], 'time':['2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04','2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04','2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04'], 'value':[2.3,3.4, 1.4, 5.6, 3, 2.9, 2.8, 1.9, 3.1, 4.2,2.5, 1.2]})
观
请注意,我不一定需要所有那些花哨的员工。所有我想要的是能够有一个矩阵,我可以将时间序列并排。
我认为必须有一种方法可以使用pandas groupby ,但我似乎无法找到它。