如何连接两个不重复的数据框?
- 2025-04-16 08:57:00
- admin 原创
- 10
问题描述:
我想将两个数据框 连接成A
一个B
没有重复行的新数据框(如果 中的行B
已经存在A
,则不要添加):
数据框A
:
I II
0 1 2
1 3 1
数据框B
:
I II
0 5 6
1 3 1
新数据框:
I II
0 1 2
1 3 1
2 5 6
我怎样才能做到这一点?
解决方案 1:
最简单的方法就是进行连接,然后删除重复项。
>>> 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
目的reset_index(drop=True)
是修复concat()
和之后的索引。如果没有它,您将拥有而不是 的drop_duplicates()
索引。如果不立即重置,这可能会导致后续操作出现问题。[0,1,0]
`[0,1,2]`dataframe
解决方案 2:
如果 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
解决方案 3:
我很惊讶 Pandas 没有提供原生解决方案。我认为,如果处理大型数据集,直接删除重复项效率不高(Rian G 建议如此)。
使用集合查找不重叠的索引可能是最有效的。然后使用列表推导将索引转换为“行位置”(布尔值),您需要使用 iloc[,] 访问行。下面是一个执行此任务的函数。如果您没有选择特定的列 (col) 来检查重复项,那么系统将根据您的要求使用索引。如果您选择了特定的列,请注意“a”中现有的重复项将保留在结果中。
import pandas as pd
def append_non_duplicates(a, b, col=None):
if ((a is not None and type(a) is not pd.core.frame.DataFrame) or (b is not None and type(b) is not pd.core.frame.DataFrame)):
raise ValueError('a and b must be of type pandas.core.frame.DataFrame.')
if (a is None):
return(b)
if (b is None):
return(a)
if(col is not None):
aind = a.iloc[:,col].values
bind = b.iloc[:,col].values
else:
aind = a.index.values
bind = b.index.values
take_rows = list(set(bind)-set(aind))
take_rows = [i in take_rows for i in bind]
return(pd.concat([a, b.iloc[take_rows,:]]))
# Usage
a = pd.DataFrame([[1,2,3],[1,5,6],[1,12,13]], index=[1000,2000,5000])
b = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], index=[1000,2000,3000])
append_non_duplicates(a,b)
# 0 1 2
# 1000 1 2 3 <- from a
# 2000 1 5 6 <- from a
# 5000 1 12 13 <- from a
# 3000 7 8 9 <- from b
append_non_duplicates(a,b,0)
# 0 1 2
# 1000 1 2 3 <- from a
# 2000 1 5 6 <- from a
# 5000 1 12 13 <- from a
# 2000 4 5 6 <- from b
# 3000 7 8 9 <- from b
解决方案 4:
另一种选择:
concatenation = pd.concat([
dfA,
dfB[dfB['I'].isin(dfA['I']) == False], # <-- get all the data in dfB that doesn't show up in dfB (based on values in column 'I')
])
该对象concatenation
将是:
I II
0 1 2
1 3 1
2 5 6
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD