合并两个数据帧,同时考虑其中一个数据帧中的新行



具有以下数据帧,

df1

Device  name  Rev serial
0      D1  fpc0    1    xyz
1      D1  pic0    1    xxx
2      D2  fpc0    1    hij
3      D2  pic0    1   hijj
4      D3  fpc0    2    xyx
5      D3  pic0    1    xll
6      D3  fpc1    2    xhh
7      D4  fpc1    1    tll
8      D4  fpc2    1    xho
9      D4  pic0    1    lss
10     D5  fpc0    1    qqq
11     D5  pic0    1    xqz

df2

Device  name  Rev serial
0      D1  fpc0    1    xyz
1      D1  pic0    1    xxx
2      D2  fpc0    1    hij
3      D2  pic0    1   xxxx
4      D3  fpc0    2    xij
5      D3  pic0    1    xll
6      D3  fpc1    2    xhh
7      D3  pic1    1    xtt
8      D4  fpc1    1    tll
9      D4  fpc2    1    xho
10     D4  pic0    1    lss
11     D4  pic1    2    xss
12     D5  fpc0    1    qqq
13     D5  pic0    1    xqz
14     D5  pic1    2    xpr

,其中一个设备可以在两个数据帧中都有相同数量的行,也可以有不同的行,我不知道是否可以用一种简单的方式(即具有单个索引(实现以下目标:

预期输出:

Device  name  Rev serial      _merge   new_values
0      D1  fpc0    1    xyz        both   False
1      D1  pic0    1    xxx        both   False
2      D2  fpc0    1    hij        both   False
3      D2  pic0    1   hijj   left_only   False
4      D3  fpc0    2    xyx   left_only   False
5      D3  pic0    1    xll   left_only   False
6      D3  fpc1    2    xhh        both   False
7      D4  fpc1    1    tll        both   False
8      D4  fpc2    1    xho        both   False
9      D4  pic0    1    lss        both   False
10     D5  fpc0    1    qqq        both   False
11     D5  pic0    1    xqz        both   False
12     D2  pic0    1   xxxx  right_only   False
13     D3  fpc0    2    xij  right_only   False
14     D3  pic1    1    xll  right_only   False
15     D3  pic0    1    xtt  right_only   True
16     D4  pic1    2    xss  right_only   True
17     D5  pic1    2    xpr  right_only   True

new_ values列意味着df2中的这个设备具有"0";新的";条目:

例如:

在df1中,我们有:

4      D3  fpc0    2    xyx
5      D3  pic0    1    xll
6      D3  fpc1    2    xhh

在df2中,我们有:

4      D3  fpc0    2    xij
5      D3  pic0    1    xll
6      D3  fpc1    2    xhh
7      D3  pic0    1    xtt <--- this row is new for this device

基本上我们可以有两种情况:

案例1

一个设备(D1、D2等(在两个数据帧中可以具有相同数量的行(元素可以相等或不同(:

D1和D2(在这种情况下,所有行都相等(

df1

0      D1  fpc0    1    xyz   
1      D1  pic0    1    xxx   
2      D2  fpc0    1    hij   
3      D2  pic0    1   xxxx   

df2

0      D1  fpc0    1    xyz  
1      D1  pic0    1    xxx  
2      D2  fpc0    1    hij  
3      D2  pic0    1   xxxx  

案例2

一个设备在一个数据帧中可以有X行,在另一个数据框中可以有X+y(元素可以相等或不同(:

df1


5      D3  pic0    1    xll
6      D3  fpc1    2    xhh
7      D4  fpc1    1    tll
8      D4  fpc2    1    xho
9      D4  pic0    1    lss
10     D5  fpc0    1    qqq
11     D5  pic0    1    xqz

df2

4      D3  fpc0   2    xij
5      D3  pic1    1    xll
6      D3  fpc1    2    xhh
7      D3  pic0    1    xtt
8      D4  fpc1    1    tll
9      D4  fpc1    1    xho
10     D4  pic0    1    lss
11     D4  pic1    2    xss
12     D5  fpc0    1    qqq
13     D5  pic0    1    xqz
14     D5  pic1    2    xpr

在这种情况下,来自df2的索引6和7是"0";新的";对于D3,索引11是"0";新的";对于D4和索引14是"0";新的";对于D5。

我在这里做了一个非常相似的问题:

合并两个数据帧并添加一个新列

但有些事情我没有考虑在内。

谢谢。

我尝试过以下方法,但我不确定它是否是最佳

df1['_common_1'] = df1['Device'] + df1['name']
df1['_common_2'] = df1['Device'] + df2['name']
final_df = pd.merge(df1,df2,how='outer',indicator=True)
final_df['new_values'] = ~final_df.pop('_common_2').isin(final_df.pop('_common_1'))
Device  name  Rev serial      _merge  new_values
0      D1  fpc0    1    xyz        both       False
1      D1  pic0    1    xxx        both       False
2      D2  fpc0    1    hij        both       False
3      D2  pic0    1   hijj   left_only       False
4      D3  fpc0    2    xyx   left_only       False
5      D3  pic0    1    xll        both       False
6      D3  fpc1    2    xhh        both       False
7      D4  fpc1    1    tll        both       False
8      D4  fpc2    1    xho        both       False
9      D4  pic0    1    lss        both       False
10     D5  fpc0    1    qqq        both       False
11     D5  pic0    1    xqz        both       False
12     D2  pic0    1   xxxx  right_only       False
13     D3  fpc0    2    xij  right_only       False
14     D3  pic1    1    xtt  right_only        True
15     D4  pic1    2    xss  right_only        True
16     D5  pic1    2    xpr  right_only        True

最新更新