【问题标题】:Pandas: Merge two data frames and keep non-intersecting data from a single data framePandas:合并两个数据框并保留来自单个数据框的不相交数据
【发布时间】:2017-06-27 13:45:50
【问题描述】:

愿望:

我想要一种方法来合并两个数据框并保留指定数据框中的非相交数据。

问题:

我有重复的数据,我希望这一行可以删除重复的数据:

 final_df = new_df[~new_df.isin(previous_df)].dropna()

示例数据和数据测试:

 record = Record(1000, 9300815, '<redacted type>', '<redacted id>')
 test_df = pd.DataFrame([record])
 if not final_df.empty:

      # this produces an empty data frame
      empty_df = test_df[test_df.isin(final_df)].dropna()

      # this produces the record
      record_df = final_pdf[final_pdf.col01 == record.col01]

背景:

我正在加载 xml 数据并将 xml 文件转换为几种不同的记录类型作为命名元组。我将每种记录类型拆分为自己的数据框。然后,我通过构造previous_df 来比较 xml 文件中的当前数据集与已加载到数据库中的数据:

 previous_df = pd.read_sql_table(table_name, con=conn, schema=schema, columns=columns)

列是根据命名元组中的字段动态创建的。数据库模式是使用 sqlalchemy 生成的,我添加了UniqueConstraint 以在我认为数据库中有重复项时进行管理。

提前感谢您提供的任何帮助。

【问题讨论】:

  • pandas.DataFrame.duplicated。如果您添加一些示例数据和预期输出,您将获得一些详细的帮助。
  • 我还使用了drop_duplicates(keep=False),它有效地调用duplicated,然后在一行中删除它们。我真的需要一个好方法来合并两个数据框并删除它们的交集。
  • 我建议您查看Pandas Documentation 关于合并数据帧的信息。我不知道你想去哪里,但你可以在那里找到解决问题的方法

标签: python postgresql pandas sqlalchemy data-ingestion


【解决方案1】:

从两个数据帧中保留单个记录:

首先尝试concat 数据帧,这样您就可以确定会有重复。然后申请drop_duplicates,我想你最终会得到你所追求的。请看下面的例子:

#Create dummy data
df1 = pd.DataFrame(columns=["A","B"],data=[[1,2],[3,4],[5,6]])
print(df1)

   A  B
0  1  2
1  3  4
2  5  6

df2 = pd.DataFrame(columns=["A","B"],data=[[3,4],[5,6],[7,8],[9,10]])
print(df2)

   A   B
0  3   4
1  5   6
2  7   8
3  9  10

#Concatenate dataframes
df = pd.concat([df1,df2],axis=0)
print(df)

   A   B
0  1   2
1  3   4
2  5   6
0  3   4
1  5   6
2  7   8
3  9  10

#Drop duplicates
df = df.drop_duplicates(keep=False)
print(df)

   A   B
0  1   2
2  7   8
3  9  10

仅保留一个数据帧中的单个记录:

如果您只想保留新数据帧中的数据,只需使用一个肮脏的小技巧:concat 旧数据帧两次,因此所有旧记录都将落入 drop_duplicates 标准。像这样:

#Concatenate dataframes with old dataframe taken twice!
df = pd.concat([df1,df1,df2],axis=0)

#Now you will only end up with the records from second dataframe
df = df.drop_duplicates(keep=False)
print(df)

   A   B
2  7   8
3  9  10

【讨论】:

  • 谢谢 - 我会试试的
  • 如果您只想保留新数据帧中的数据,只需使用一个肮脏的小技巧:将旧数据帧连接两次,这样所有旧记录都将落入 drop_duplicates 标准。
  • 效果很好!谢谢!为您的回答 +1
  • 您只保留一个数据帧中的记录的小技巧真是疯狂而高效,非常感谢!
猜你喜欢
  • 2022-11-23
  • 2015-10-17
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 2021-04-11
  • 2019-03-31
相关资源
最近更新 更多