我正在尝试将一个数据帧的片段与另一个数据帧的片段连接起来。要连接的数据帧的结构简化如下:
left:
ID f1 TIME
1 10 1
3 10 1
7 10 1
9 10 2
2 10 2
1 10 2
3 10 2
right:
ID f2 f3
1 0 11
7 9 11
我需要按时间选择左侧的数据集,并且需要附加右侧的数据集,我想要的结果如下:
left:
ID f1 TIME f2 f3
1 10 1 0 11
3 10 1 nan nan
7 10 1 9 11
9 10 2 nan nan
2 10 2 nan nan
1 10 2 nan nan
3 10 2 nan nan
目前我通常以这种方式加入数据帧:
left = left.join(right.set_index('ID'), on='ID')
在本例中我使用:
left[left.TIME == 1] = left[left.TIME == 1].join(right.set_index('ID'), on='ID')
我也尝试过合并,但结果是左侧数据框没有任何其他列。 最后,我的脚本结构需要对数据框中的每个唯一时间执行此操作,因此:
for t in numpy.unique(left.TIME):
#do join on the fragment left.TIME == t
如果我将连接函数返回的值保存在新的数据框中,一切正常,但尝试在左侧数据框中添加值不起作用。
编辑:左侧数据集的 ID 可以出现多次,但不能出现在同一 TIME 值内。
最佳答案
您可以先按 boolean indexing
进行过滤、合并
和 concat
最后:
df1 = left[left['TIME']==1]
#alternative
#df1 = left.query('TIME == 1')
df2 = left[left['TIME']!=1]
#alternative
#df2 = left.query('TIME != 1')
df = pd.concat([df1.merge(right, how='left'), df2])
print (df)
ID TIME f1 f2 f3
0 1 1 10 0.0 11.0
1 3 1 10 NaN NaN
2 7 1 10 9.0 11.0
3 9 2 10 NaN NaN
4 2 2 10 NaN NaN
5 1 2 10 NaN NaN
6 3 2 10 NaN NaN
编辑:合并
创建默认索引,因此可能的解决方案是先创建列,然后设置为索引:
print (left)
ID f1 TIME
10 1 10 1
11 3 10 1
12 7 10 1
13 9 10 2
14 2 10 2
15 1 10 2
16 3 10 2
#df = left.merge(right, how='left')
df1 = left[left['TIME']==1]
df2 = left[left['TIME']!=1]
df = pd.concat([df1.reset_index().merge(right, how='left').set_index('index'), df2])
print (df)
ID TIME f1 f2 f3
10 1 1 10 0.0 11.0
11 3 1 10 NaN NaN
12 7 1 10 9.0 11.0
13 9 2 10 NaN NaN
14 2 2 10 NaN NaN
15 1 2 10 NaN NaN
16 3 2 10 NaN NaN
编辑:
经过讨论修改输入数据后可以使用:
df = left.merge(right, how='left', on=['ID','TIME'])
关于python - 连接数据帧的片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49873535/