首页 > 解决方案 > 按 ID 和时间透视具有混合值类型的 pandas 表

问题描述

我有一个df类型的表(不是实际的表),其中包含混合类型的值:

      ID    |        Time        |  Category  |  Value
ix   ----------------------------------------------------
0     457   |  2010-09-04 15:00  |  Name      | 'Foo'
1     542   |  2010-09-04 15:00  |  Name      | 'Bar'
2     542   |  2010-09-04 15:00  |  Sub       |  0.2
3     542   |  2010-09-04 15:00  |  Age       |  18
4     457   |  2010-09-04 15:40  |  Sub       |  0.7
5     457   |  2010-09-04 15:40  |  Age       |  20

现在我想将这个表转换成cat_df这样,每个类别都是它自己的列,其值为行,它首先由 ID 索引,然后是特定 ID 内的时间,这样:

      ID    |        Time        |  Name  |  Sub  | Age
ix   ----------------------------------------------------
0     457   |  2010-09-04 15:00  | 'Foo'  |  -    |  -
1     457   |  2010-09-04 15:40  |   -    |  0.7  | 20
2     542   |  2010-09-04 15:00  | 'Bar'  |  0.2  | 18

破折号表示NA/NoneType。每当我使用df.pivotID 和 Time 作为索引时,我都会不断收到重复错误。所以我运行了以下代码:

mid_df = df.pivot(columns='Category', values='Value')

我得到下表作为结果mid_df

      Name    |   Sub    |  Age  
ix   ------------------------------ 
0     'Foo'   |    -     |  -
1     'Bar'   |    -     |  -
2       -     |    0.2   |  -
3       -     |    -     |  18
4       -     |    0.7   |  -
5       -     |    -     |  20

哪个好,我猜?我可以通过加入来添加 ID 和时间数据ix。但我想按每个 ID 的时间组合行。获得上面的决赛桌。

标签: pythonpandasdataframe

解决方案


对于 ID 没有继续显示,您想将它们分为两组,那么我们需要创建一个键(通过使用cumsum)以帮助拆分,first将为每列返回first非空值

s=pd.concat([df[['ID','Time']],df.pivot(columns='Category', values='Value')],axis=1)
s.groupby([s.ID,s.ID.diff().ne(0).cumsum()]).first()
Out[540]: 
         ID             Time  Age   Name  Sub
ID  ID                                       
457 1   457  2010-09-0415:00  NaN  'Foo'  NaN
    3   457  2010-09-0415:40   20    NaN  0.7
542 2   542  2010-09-0415:00   18  'Bar'  0.2

推荐阅读