我正在尝试合并这两个数据帧(DF1 和 DF2(,但仅限于不在第一个数据帧 (DF1( 中的记录。在下面的示例中,我希望结果只选取记录 0,1,4,5 而不是合并 2,3,因为它们在 DF1 中已经具有复杂的单元外观。 我尝试合并没有运气和 np.where
np.where(df1[['complex','unit']] != df2[['complex','unit']])
这导致了ValueError: Can only compare identically-labeled DataFrame objects
DF1
company complex unit location datetime serial seq interval
3 6 10 UpMaster 2017-07-21 00:33:37 1505.0 3400.0 1554
4 6 11 UpMaster 2017-07-21 00:59:44 1505.0 3401.0 1567
5 6 10 UpMaster 2017-07-21 01:25:41 1505.0 3402.0 1557
6 6 A UpMaster 2017-07-21 01:51:45 1505.0 3403.0 1564
7 6 13 UpMaster 2017-07-21 02:17:48 1505.0 3404.0 1563
DF2
index complex unit
0 7 1807
1 4 7
2 6 10
3 6 A
4 10 110A
5 6 12
期望的结果
company complex unit location datetime serial seq interval
3 6 10 UpMaster 2017-07-21 00:33:37 1505.0 3400.0 1554
4 6 11 UpMaster 2017-07-21 00:59:44 1505.0 3401.0 1567
5 6 10 Down 2017-07-21 01:25:41 1505.0 3402.0 1557
6 6 A UpMaster 2017-07-21 01:51:45 1505.0 3403.0 1564
7 6 13 UpMaster 2017-07-21 02:17:48 1505.0 3404.0 1563
8 7 1807 NaN NaN NaN NaN Nan
9 4 7 NaN NaN NaN NaN Nan
10 10 110A NaN NaN NaN NaN Nan
11 6 12 NaN NaN NaN NaN Nan
编辑:: 追加方法效果很好,谢谢!
df1 = df1.append(df2[-df2['unit_id'].isin(df1['unit_id'].unique())], ignore_index=True)
以上是我在添加唯一标识符后采用unit_id最终解决方案。 如果没有这个,建议一个聪明的解决方案从 2 个半唯一字段中制作密钥。
df1['key'] = df1['complex'].astype(str) + ' ' + df1['unit'].astype(str)
df2['key'] = df2['complex'].astype(str) + ' ' + df2['unit'].astype(str)
df1 = df1.append(df2[-df2['key'].isin(df1['key'].unique())],ignore_index=True)
df1 = df1.drop('key',axis=1)
更新的答案
您仍然可以将追加与条件一起使用,但只需要创建一个额外的key
列:
df1['key'] = df1['complex'].astype(str) + ' ' + df1['unit'].astype(str)
df2['key'] = df2['complex'].astype(str) + ' ' + df2['unit'].astype(str)
df1 = df1.append(df2[-df2['key'].isin(df1['key'].unique())],ignore_index=True)
df1 = df1.drop('key',axis=1)
以前的答案
我认为您可以使用带有条件的append
来做您想做的事情:
df1 = df1.append(df2[-df2['complex'].isin(df1['complex'].unique())],ignore_index=True)
这将留下额外的列company, location, datetime
等与 np。NaN 值。您可以稍后使用所需的结果填充company
列