熊猫:通过选择值将具有相同列的两个数据框组合在一起

时间:2020-04-02 09:23:17

标签: python pandas

我有两个数据框:

第一个:

id  time_begin  time_end
0   1938    1946
1   1991    1991
2   1359    1991
4   1804    1937
6   1368    1949
... ... ...

第二:

id  time_begin  time_end
1   1946    1946
3   1940    1954
5   1804    1925
6   1978    1978
7   1912    1949

现在,我想以这样一种方式组合两个数据帧,使我从这两个数据帧中获得所有行。但是由于有时该行将同时出现在两个数据帧中(例如第1行和第6行),因此我想选择两个的最小time_begin和最大的time_end。因此,我的预期结果是:

id  time_begin  time_end
0   1938    1946
1   1946    1991
2   1359    1991
3   1940    1954
5   1804    1925
4   1804    1937
6   1368    1978
7   1912    1949
... ... ...

我该如何实现?据我所知,普通的连接/合并操作不允许这样做。

2 个答案:

答案 0 :(得分:2)

您可以先merge个数据帧,然后将groupbyagg一起使用以选择min(time_begin)和max(time_end)

df1=pd.DataFrame({'id':[0,1,2,4,6],'time_begin':[1938,1991,1359,1804,1368],'time_end': 
                       [1946,1991,1991,1937,1949]})
df2=pd.DataFrame({'id':[1,3,5,6,7],'time_begin':[1946,1940,1804,1978,1912],'time_end': 
                       [1946,1954,1925,1978,1949]})

#merge
df=df1.merge(df2,how='outer') 
#groupby
df=df.groupby('id').agg({'time_begin':'min','time_end':'max'})

输出:

enter image description here

答案 1 :(得分:1)

技巧是为每列定义不同的聚合函数:

pd.concat([df1, df2]).groupby('id').agg({'time_begin':'min', 'time_end':'max'})