通过区间合并两个pandas数据框

3

我有两个pandas数据帧,格式如下:

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分组,然后迭代每一行并在出现时更改状态来实现迭代。有没有更可扩展的pandas内置方法来做到这一点?


我无法理解 df_statechangedf_tsdf_out 的关系,您能否再详细解释一下? - Phung Duy Phong
我认为除了merge之外,您还需要使用cut。请参阅此线程以获取更多详细信息:http://stackoverflow.com/questions/42649224/pandas-alternate-way-to-add-new-column-with-lot-of-conditions-other-than-apply - arnold
我相信您需要创建一个函数来按照您的需求连接这些数据框。基本上,取出数据框的一行并与另一个数据框的行进行比较。将该函数应用于第一个数据框。 - user2685079
2个回答

2

很遗憾,pandas merge只支持等值连接。在以下线程中查看更多详细信息: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)]

0

你可以在两列上合并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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接