Pandas/Python:如何连接两个没有重复的数据帧?

MJP*_*MJP 31 python pandas

我想将两个数据帧A,B连接到一个没有重复行的新数据帧(如果B中的行已存在于A中,请不要添加):

数据帧A:数据帧B:

   I    II    I    II
0  1    2     5    6
1  3    1     3    1
Run Code Online (Sandbox Code Playgroud)

新数据帧:

     I    II
  0  1    2
  1  3    1
  2  5    6
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Rya*_*n G 57

最简单的方法是只进行连接,然后重复数据删除.

>>> df1
   A  B
0  1  2
1  3  1
>>> df2
   A  B
0  5  6
1  3  1
>>> pandas.concat([df1,df2]).drop_duplicates().reset_index(drop=True)
   A  B
0  1  2
1  3  1
2  5  6
Run Code Online (Sandbox Code Playgroud)

reset_index(drop=True)是后来修复指标concat()drop_duplicates().没有它你将有一个索引[0,1,0]而不是[0,1,2].dataframe如果不立即重置,这可能会导致进一步操作的问题.

  • 也可以在concat中使用ignore_index = True来避免欺骗索引. (3认同)
  • @AndyHayden 可能值得注意 - 您可以使用 `ignore_index=True` 来避免重复索引,但是如果您不使用 `reset_index`,那么您可能已经跳过了索引(因为它们被删除了)(例如 0、1、2 , 4, 5 ...),这可能是不可取的 (2认同)

mar*_*wan 5

如果 DataFrame A 中已有重复行,则连接然后删除重复行,将从 DataFrame A 中删除您可能想要保留的行。

在这种情况下,您需要创建一个具有累积计数的新列,然后删除重复项,这完全取决于您的用例,但这在时间序列数据中很常见

这是一个例子:

df_1 = pd.DataFrame([
{'date':'11/20/2015', 'id':4, 'value':24},
{'date':'11/20/2015', 'id':4, 'value':24},
{'date':'11/20/2015', 'id':6, 'value':34},])

df_2 = pd.DataFrame([
{'date':'11/20/2015', 'id':4, 'value':24},
{'date':'11/20/2015', 'id':6, 'value':14},
])


df_1['count'] = df_1.groupby(['date','id','value']).cumcount()
df_2['count'] = df_2.groupby(['date','id','value']).cumcount()

df_tot = pd.concat([df_1,df_2], ignore_index=False)
df_tot = df_tot.drop_duplicates()
df_tot = df_tot.drop(['count'], axis=1)
>>> df_tot

date    id  value
0   11/20/2015  4   24
1   11/20/2015  4   24
2   11/20/2015  6   34
1   11/20/2015  6   14
Run Code Online (Sandbox Code Playgroud)