具有以下数据帧,
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