python - 如果在另一个数据框中找到重复项,如何从一个数据框中删除重复项

标签 python pandas dataframe merge concatenation

我有两个数据框,每个数据框都有数百列。

#df1 = 190 columns
#df2 = 262 columns

#subset dataframe
df1 = pd.DataFrame({'Key': ['10003', '10009', '10010', '10034', '10665'], 
               'Num1': [12,13,13,13,13],
               'Color': ['red','orange','red','red','red'],
              'Date1': [20120506, 20120506, 20120506,20120506,20120620],
              'Date2': [20120528, 20120507, 20120615,20120629,20120621]})
df2 = pd.DataFrame({'Key': ['10003', '10009', '10010', '10011', '10012','10034','10034', '10034'], 
               'Num1': [12,13,13,13,13,13,14,14],
               'Num2': [121,122,122,124,125,126,127,128],
              'Date1': [20120506, 20120506, 20120506,20120506,20120620,20120506,20120206,20120405],
              'Date2': [20120528, 20120507, 20120615,20120629,20120621,20120629,20120506,20120506]})

我想删除 df2 中也在 df1 中的所有行,但保持 df1 不变。

使用 pd.concat() 或 merge() 时我非常接近,但问题是我创建了一堆不必要的列 [使用 concat() 和 merge()] 并且添加了仅在 df1 中找到的行到 df2 [使用 concat()]。实际上,当“Key”、“Date1”、“Num”和“Date2”在行中常见时,它们可以被视为重复项。

下面的尝试很接近,但它添加了 df1 中的额外列并保留 df1 中的所有额外行。我不需要 df1 中的任何附加列或行,只是为了删除两个 dfs 中存在的 df2 中的任何重复项。 df1 将保持不变。

a = pd.concat([df2,df1])
a.drop_duplicates(subset=['Key', 'Num1','Date1','Date2'],keep=False, inplace=True)

    Color   Date1       Date2       Key     Num1    Num2
3   NaN     20120506    20120629    10011   13      124.0
4   NaN     20120620    20120621    10012   13      125.0
6   NaN     20120206    20120506    10034   14      127.0
7   NaN     20120405    20120506    10034   14      128.0
4   red     20120620    20120621    10665   13      NaN

我也根据here的建议尝试了合并。 ,但我仍然得到重复的列。

df_all = df2.merge(df1.drop_duplicates(), on=['Key', 'Num1','Date1','Date2'], 
               how='left', indicator=True)
df_all[df_all['_merge'] == 'left_only']

合并结果,

     Date1      Date2       Key     Num1    Num2    Color   _merge
3    20120506   20120629    10011   13      124     NaN     left_only
4    20120620   20120621    10012   13      125     NaN     left_only
6    20120206   20120506    10034   14      127     NaN     left_only
7    20120405   20120506    10034   14      128     NaN     left_only

合并让我获得了正确的行和额外的列。通常这不会是一个问题,我可以只使用 .drop() 但合并后有 100 多个额外的列。

如何删除重复项,而无需从 df1 中增加列或添加其他行。

最终预期结果:

    Date1       Date2       Key     Num1    Num2
3   20120506    20120629    10011   13      124.0
4   20120620    20120621    10012   13      125.0
6   20120206    20120506    10034   14      127.0
7   20120405    20120506    10034   14      128.0

最佳答案

使用on键作为df1的子集

In [514]: on = ['Date1', 'Date2', 'Num1', 'Key']

In [515]: (df2.merge(df1[on], on=on, how='left', indicator=True)
              .query('_merge == "left_only"').drop('_merge', 1))
Out[515]:
      Date1     Date2    Key  Num1  Num2
3  20120506  20120629  10011    13   124
4  20120620  20120621  10012    13   125
6  20120206  20120506  10034    14   127
7  20120405  20120506  10034    14   128

关于python - 如果在另一个数据框中找到重复项,如何从一个数据框中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48912242/

相关文章:

Python 使用空格分隔从 csv 读取数据(第一列除外)

python - Pandas - 通过比较同一数据框中的其他列值(单词)来提取列中句子中不匹配的单词

python - 使 Python RegEx 使用变量作为字符串表达式

python - Python 对象的属性是否有一个名称以使其具有与其代码等效的控制台表示?

python - 将 datetimeindex 转换为 Qx-YY 格式

python - 如何计算 pyspark 数据框中每个不同值的计数?

python - 使用两个 DataFrame 的 Pandas groupby 总和

python - Python 列表中的组合

python - SOL_有什么用?

python - 针对 python 2 与 python 3 编译时,Cython 代码运行速度慢 125 倍