Pandas合并表:只有第二个表中的不同ID

时间:2016-03-01 09:09:57

标签: python pandas merge concat

我试图弄清楚是否可以加入/合并/连接两个表而不是'外部'我想从第二个表中选择带有pandas内置选项的独特ID。

现在我正在做一些事情 我觉得我的代码不是很优雅:

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['c', '8', '1']]
b = [['a', '52', '49'], ['b', '23', '0.05'], ['x', '5', '0']]
df1 = pd.DataFrame(a, columns=['id_col', 'two', 'three'])
df2 = pd.DataFrame(b, columns=['id_col', 'two', 'three'])


# remove df2 entries also in df1
different_ids = set(df2.id_col).difference(set(df1.id_col))
df2 = df2[df2.id_col.isin(different_ids)]
# merge data frames
df_merged = pd.concat([df1,df2])

合并的df应该有来自df1的条目a,b,c和来自df2的x。

2 个答案:

答案 0 :(得分:1)

我认为您可以通过将df2id_col一起对df1.id_col进行子集isin,然后将df1res = pd.concat([df1, df2[~df2.id_col.isin(df1.id_col)]]) In [186]: res Out[186]: id_col two three 0 a 1.2 4.2 1 b 70 0.03 2 c 8 1 2 x 5 0 进行对,并生成数据帧来完成所有这些操作:

In [23]: %timeit pd.concat((df1, df2)).drop_duplicates('id_col')
100 loops, best of 3: 1.95 ms per loop

In [24]: %timeit pd.concat([df1, df2[~df2.id_col.isin(df1.id_col)]])
100 loops, best of 3: 1.79 ms per loop

<强>定时:

@arr = qw(1 2 3 4);

print $arr[0],"\n";
print @arr[0],"\n";

从时间比较来看,这更快..

答案 1 :(得分:1)

您可以在concatdf1 df2drop_duplicates以及id_col

>>> df = pd.concat((df1, df2))
>>> print(df.drop_duplicates('id_col'))
  id_col  two three
0      a  1.2   4.2
1      b   70  0.03
2      c    8     1
2      x    5     0