按间隔合并两个熊猫数据帧

Posted

技术标签:

【中文标题】按间隔合并两个熊猫数据帧【英文标题】:Merging two pandas dataframes by interval 【发布时间】:2017-10-21 17:22:38 【问题描述】:

我有两个具有以下格式的熊猫数据框:

df_ts = pd.DataFrame([
        [10, 20, 1,  'id1'],
        [11, 22, 5,  'id1'],
        [20, 54, 5,  'id2'],
        [22, 53, 7,  'id2'],
        [15, 24, 8,  'id1'],
        [16, 25, 10, 'id1']
    ], columns = ['x', 'y', 'ts', 'id'])


df_statechange = pd.DataFrame([
        ['id1', 2, 'ok'],
        ['id2', 4, 'not ok'],
        ['id1', 9, 'not ok']
    ], columns = ['id', 'ts', 'state'])

我正在尝试将其转换为格式,例如:

df_out = pd.DataFrame([
        [10, 20, 1,  'id1', None    ],
        [11, 22, 5,  'id1', 'ok'    ],
        [20, 54, 5,  'id2', 'not ok'],
        [22, 53, 7,  'id2', 'not ok'],
        [15, 24, 8,  'id1', 'ok'    ],
        [16, 25, 10, 'id1', 'not ok']
    ], columns = ['x', 'y', 'ts', 'id', 'state'])

我了解如何通过按 id 分组然后遍历每一行并在出现时更改状态来迭代地完成它。是否有熊猫内置的更具可扩展性的方式来做到这一点?

【问题讨论】:

我无法弄清楚df_statechangedf_tsdf_out 之间的关系,你能解释一下吗 我认为除了merge 之外,您还需要cut。有关更多详细信息,请参阅此线程***.com/questions/42649224/… 我相信你必须创建一个函数来加入你想要的框架。基本上取一行数据帧并将其与另一个数据帧的行进行比较。将函数应用于第一个数据帧。 【参考方案1】:

不幸的是,pandas 合并仅支持相等连接。在以下线程中查看更多详细信息: merge pandas dataframes where one value is between two others 如果您想按间隔合并,则需要克服该问题,例如在合并后添加另一个过滤器:

joined = a.merge(b,on='id')
joined = joined[joined.ts.between(joined.ts1,joined.ts2)]

【讨论】:

【参考方案2】:

您可以在两列上合并 pandas 数据框:

pd.merge(df_ts,df_statechange, how='left',on=['id','ts'])

在您在这里分享的df_statechange 中,两个数据帧中的 ts 没有共同值。显然你只是在这里复制了不完整的数据框。所以我得到了这个输出:

    x   y  ts   id state
0  10  20   1  id1   NaN
1  11  22   5  id1   NaN
2  20  54   5  id2   NaN
3  22  53   7  id2   NaN
4  15  24   8  id1   NaN
5  16  25  10  id1   NaN

但实际上,如果您在数据框中有共同的ts,它将有您想要的输出。例如:

df_statechange = pd.DataFrame([
        ['id1', 5, 'ok'],
        ['id1', 8, 'ok'],
        ['id2', 5, 'not ok'],
        ['id2',7, 'not ok'],
        ['id1', 9, 'not ok']
    ], columns = ['id', 'ts', 'state'])

输出:

  x   y  ts   id   state
0  10  20   1  id1     NaN
1  11  22   5  id1      ok
2  20  54   5  id2  not ok
3  22  53   7  id2  not ok
4  15  24   8  id1      ok
5  16  25  10  id1     NaN

【讨论】:

我正在尝试按时间间隔合并数据帧,因此通常没有共同的值。 df_statechange 背后的基本思想是,它为 df_ts 中的所有时间戳传递此 id 的状态,直到此状态发生更改。

以上是关于按间隔合并两个熊猫数据帧的主要内容,如果未能解决你的问题,请参考以下文章

熊猫如何按间隔按列拆分数据帧

如何从两个合并的数据帧中选择完成之前和之后的特定时间间隔?

合并具有不同时间戳(不同时间间隔)的两个数据帧

使用不同的时间间隔合并并填充Pandas中的两个数据帧

将数据帧与时间戳和间隔合并

如何从熊猫数据框列中选择日期间隔? [复制]