python - 按 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.pivot
ID 和 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 的时间组合行。获得上面的决赛桌。
- 那么如何在记住 ID 和 Time 的同时直接转换
df
成呢?cat_df
- 或者我如何组合这些行
mid_df
以确保每个时间步的 NA 最少? - 聚合:对于这两种方法,如果我想按小时/数据聚合数据,我将如何处理值的混合数据类型?我想平均数值并选择最后一个分类
- 此外,有没有办法确定要聚合哪个时间段以确保最少的 NA?
解决方案
对于 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
推荐阅读
- javascript - 来自兄弟姐妹的数组出现了一个索引短
- arrays - 对声明感到困惑
- android - 使用 Kodein 进行单元测试
- javascript - JavaScript 产品新菜单
- javascript - 无需确认即可从网站自动打印 pdf
- javascript - 有没有什么方法可以使用 angular slickgrid 中的打字稿在表格单元格中显示具有不同选项的下拉菜单
- asp.net-core - blazor 中非布尔值的条件属性
- c++ - GLM的向量矩阵乘法行为?
- android - 是否可以使用 Android Studio 调试 linux 原生进程?
- android - 在alertDialog中单击按钮时如何更新recyclerView