按其他列

时间:2018-01-29 11:21:13

标签: python pandas numpy dataframe pandas-groupby

我真的不确定如何表达我的问题,从而说出我的问题。当然这是一个众所周知的问题,但我找不到如何解决它。

我有一个像这样的数据框

     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 ,但我似乎无法找到它。

0 个答案:

没有答案