python 如何从一个 Dataframe 中删除存在于另一个 Dataframe 中的行

njthzxwz  于 2023-08-02  发布在  Python
关注(0)|答案(5)|浏览(270)

我有两个 Dataframe 。如果在df 1中,我有一个名字和出生日期与df 2中相同的人,我想从df 1中删除所有具有此名字和出生日期的行。如何使用Pandas?
df1=
| 出生日期|param1| param2| param10| param10 |
| --|--|--|--| ------------ |
| 日期1|什么东西|什么东西|什么东西| something |
| 日期2|什么东西|什么东西|什么东西| something |
| 日期3|什么东西|什么东西|什么东西| something |
| 日期4|什么东西|什么东西|什么东西| something |
df2=
| 出生日期|param11| param12| param20| param20 |
| --|--|--|--| ------------ |
| 日期1|什么东西|什么东西|什么东西| something |
| 日期2|什么东西|什么东西|什么东西| something |

ql3eal8s

ql3eal8s1#

另一种可能的解决方案:

d1 = df1.set_index(['Full name', 'Birth date'])
d2 = df2.set_index(['Full name', 'Birth date'])

d1.loc[d1.index.difference(d2.index)].reset_index()

字符串
输出量:

Full name Birth date     param1     param2    param10
0    Name 3      date3  something  something  something
1    Name 4      date4  something  something  something

pes8fvy9

pes8fvy92#

这里有一个办法:

merged = df1.merge(df2, on=['Full name', 'Birth date'], how='outer', indicator=True)

# Filter out rows that are present in both df1 and df2
out = merged[merged['_merge'] == 'left_only'][df1.columns]

字符串
产出:

Full name Birth date     param1     param2    param10
2    Name 3      date3  something  something  something
3    Name 4      date4  something  something  something

c90pui9n

c90pui9n3#

简短回答

  • 注意:* 如果我对你的问题的理解是正确的,你应该能够使用下面的python pandas代码片段来做到这一点。
merged_df = pd.merge(df1, df2[['Full name', 'Birth date']], on=['Full name', 'Birth date'], how='left', indicator=True)
df1 = merged_df[merged_df['_merge'] == 'left_only'].drop(columns=['_merge'])

字符串
其中df1仅包含在df2中没有条目的行

其他详细信息

您尝试执行的操作称为 * 反连接 *。在本例中,您试图从df1中删除df2中有匹配的姓名和出生日期的行。

  • 首先,您需要确保“全名”和“出生日期”在两个 Dataframe 中具有相同的数据类型。这是确保合并操作正确工作所必需的。
  • 如果'Birth date'在两个 Dataframe 中都是字符串,则没有问题。但如果是日期时间类型,则需要确保两者的格式相同。
  • 要执行反连接,您可以使用左连接合并df1df2的“全名”和“出生日期”,然后仅保留df2的“全名”和“出生日期”为空的行。
  • indicator=True参数向输出DataFrame添加一列_merge,其中包含有关每行源的信息。根据数据源的不同,这些值可以是'left_only'、'right_only'或'both'。'_merge'值为'left_only'的行是那些在df1中但不在df2中的行,这正是您想要的。
  • 执行此操作后,df1将只包含不在df2中的行。
wvt8vs2t

wvt8vs2t4#

如前所述,如果你的原始DF中有重复的内容,这也会删除它们--但由于你的问题中没有指出,我就不提了。
您可以只concat要检查是否存在重复的列,并将其放在同一组列上:

out =  (pd.concat([df1,
                   df2[['Full name', 'Birth date']]])
          .drop_duplicates(subset=['Full name','Birth date'],
                           keep=False)
    )

字符串

j9per5c4

j9per5c45#

您可以使用指示符执行左连接(参见Pandas Merging 101),然后选择来自左侧的行。

keys = ['Full name', 'Birth date']
left_only = (
    df1[keys].merge(df2[keys].drop_duplicates(), how='left', indicator=True)
    ['_merge'].eq('left_only')
    )
df1[left_only]

个字符
.drop_duplicates()在本例中不是必需的,但我添加了它以防万一。

相关问题