基于不规则时间列合并两个数据帧

Posted

技术标签:

【中文标题】基于不规则时间列合并两个数据帧【英文标题】:Merging two dataframes based on irregular time column 【发布时间】:2020-05-07 19:31:51 【问题描述】:

我有两个不规则的时间序列作为数据帧(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 都有更新,则存在具有这两个值的行。

    1234563

    如果 [2] 中的缺失值没有先前的值,则应使用 NaN 代替它

【问题讨论】:

第 12 行值 B -> B5 怎么样???前面有一个 B8.. @StevenG 这是一个错字 - 感谢您发现它。 【参考方案1】:

首先合并您的框架并对其进行排序:

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

【讨论】:

很好的答案! df.sort_values(['time', 'item_id'])

以上是关于基于不规则时间列合并两个数据帧的主要内容,如果未能解决你的问题,请参考以下文章

基于不规则时间间隔合并 pandas DataFrame

R:合并两个不规则时间序列

有没有一种pythonic方法可以将日期时间上的数据帧与具有不规则日期时间戳的数据对合并

Pandas 基于时间窗口合并两个时间序列数据帧(cut/bin/merge)

基于部分startswith匹配合并两个数据帧

使用 pd.merge() 合并两个以上的数据帧