python - 基于不规则时间列合并两个数据帧
问题描述
我有两个不规则的时间序列作为数据帧(DataA 和 DataB),它们的行代表不同时间项目的特征(A 或 B)的值:
DataA DataB
time item_id valueA time item_id valueB
0 x A1 3 x B1
1 y A2 4 y B2
2 z A3 5 x B3
6 y A4 6 y B4
7 z A5 7 z B5
9 x A6 8 x B6
10 y A7 10 y B7
11 z A8 11 z B8
12 z A9
python中的DF定义:
dataA = [
[0 , 'x', 'A1'], [1 , 'y', 'A2'], [2 , 'z', 'A3'],
[6 , 'y', 'A4'], [7 , 'z', 'A5'], [9 , 'x', 'A6'],
[10, 'y', 'A7'], [11, 'z', 'A8'], [12, 'z', 'A9']]
dataB = [
[3 , 'x', 'B1'], [4 , 'y', 'B2'], [5 , 'x', 'B3'],
[6 , 'y', 'B4'], [7 , 'z', 'B5'], [8 , 'x', 'B6'],
[10, 'y', 'B7'], [11, 'z', 'B8']]
dataA_df = pd.DataFrame(dataA, columns = ['time', 'item_id', 'valueA'])
dataB_df = pd.DataFrame(dataB, columns = ['time', 'item_id', 'valueB'])
我想生成一个合并的数据框,结果如下:
time item_id valueA valueB
0 x A1 NaN
1 y A2 NaN
2 z A3 NaN
3 x A1 B1
4 y A2 B2
5 x A1 B3
6 y A4 B4
7 z A5 B5
8 x A1 B6
9 x A6 B6
10 y A7 B7
11 z A8 B8
12 z A9 B8
在哪里:
如果有一个项目 X 在时间 T 对 valueA 和 valueB 都有更新,则存在具有这两个值的行。
否则,如果有一项 X 仅对一个值(valueA 或 valueB)进行了更新,则存在包含该值的行并且另一个缺失值是先前的值
如果 [2] 中的缺失值没有先前的值,则应使用 NaN 代替它
解决方案
首先合并您的框架并对其进行排序:
df = pd.merge(
left=dataA_df,
right=dataB_df,
on=['time', 'item_id'],
how='outer'
)
df = df.sort_values('time')
然后通过 item_id 向前填充
df.groupby('item_id').ffill()
time item_id valueA valueB
0 x A1 NaN
1 y A2 NaN
2 z A3 NaN
3 x A1 B1
4 y A2 B2
5 x A1 B3
6 y A4 B4
7 z A5 B5
8 x A1 B6
9 x A6 B6
10 y A7 B7
11 z A8 B8
12 z A9 B8
推荐阅读
- javascript - 在 Adonis Lucid 子查询中选择 JSON 字段键
- javascript - 如何将 sap.ui.core 模型绑定到选择列表中?
- sql-server - 将创建过程代码添加到现有代码时收到错误消息?
- sql - 比较多个列以检查列是否重复 PostgreSQL
- java - 将具有多个 $expr 的 mongodb 查找写入 java
- ios - 在 Firebase iOS SDK 中更新实时数据库对象
- javascript - ReactJS + Redux props from mapStateToProps do not refresh on dispatching action
- python - 根据差异过滤数据帧有两个系列,一个通过字典映射
- vhdl - 在一行中分配一个 std_ulogic_vector 而不使用连接运算符 (&)
- excel - 我的条形码搜索不会在我的工作表中找到我的条形码。我的 vba 搜索代码无法正常工作