仅将数据帧中的新行添加到 csv 文件

Tit*_*tus 5 csv dataframe python-3.x pandas

每天我都会收到一个pandas数据框,其中有五列,分别称为column1, column2, column3, column4, column5。我想将以前未收到的行添加到保留唯一行的文件中,称为known_data.csv. 为此,我编写了一些代码

  1. known_data.csv从名为的数据帧加载数据existing_data

  2. existing_data向df添加一个名为“existing”的新列

  3. 将旧数据框与五列上existing_data调用的数据框合并new_data

  4. new_data通过查看merge[merge.existing.isnull()](新数据与现有数据的补集)来检查是否包含新行

  5. 将新行追加到known_data.csv文件中

我的代码看起来像这样

existing_data = pd.read_csv("known_data.csv")

existing_data['existing'] = 'yes'

merge_data = pd.merge(new_data, existing_data, on = ['column1', 'column2', 'column3', 'column4', 'column5'], how = 'left')

complement = merge_data[merge_data.existing.isnull()]

del complement['existing']

complement.to_csv("known_data.csv", mode='a', index=False,
                  header=False) 
Run Code Online (Sandbox Code Playgroud)

不幸的是,这段代码无法按预期运行:补码永远不会为空。即使当我收到已经记录在 中的数据时known_data.csv, 的一些行new_data仍然会被附加到文件中。

问题:我做错了什么?我怎么解决这个问题?这与我读取文件和写入文件的方式有关吗?

编辑:existing添加一个名为数据框的新列existing_data可能不是检查existing_data和之间补集的最佳方法new_data。如果有人有更好的建议,将不胜感激!

Edit2:问题是虽然数据帧看起来相同,但有些值是不同类型的。不知何故,只有当我尝试合并新数据帧的子集时才会出现此错误。

小智 2

我认为您正在寻找的是一个连接操作,然后是一个删除重复项。

# Concat the two dataframes into a new dataframe holding all the data (memory intensive):
complement = pd.concat([existing_data, new_data], ignore_index=True)

# Remove all duplicates:
complement.drop_duplicates(inplace=True, keep=False)
Run Code Online (Sandbox Code Playgroud)

这将首先创建一个包含所有旧数据和新数据的数据框,然后在第二步中删除所有重复条目。您还可以指定仅比较重复值的某些列!

请参阅此处的文档:

连接
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html

drop_duplicates
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop_duplicates.html