我有两个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内置更可扩展的方式来做到这一点?
答案 0 :(得分: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)]
答案 1 :(得分:1)
您可以在两列上合并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