每天我都会收到一个 pandas 数据框,它有五列,分别是 column1
、 column2
、 column3
、 column4
、 column5
。我想将以前没有收到的行添加到我保留唯一行的文件中,称为 known_data.csv
。为了做到这一点,我写了一些应该
known_data.csv
加载数据作为名为 existing_data
的数据帧existing_data
df 添加一个名为“现有”的新列existing_data
数据帧与五列上名为 new_data
的数据帧合并new_data
(新数据和现有数据的补码)来检查merge[merge.existing.isnull()]
是否包含新行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)
不幸的是,这段代码没有按预期运行:补码永远不会为空。即使我收到已经记录在 known_data.csv
中的数据,new_data
的某些行仍然被附加到文件中。问题: 我做错了什么?我怎么解决这个问题?它与我读取文件和写入文件的方式有关吗?
编辑: 向
existing
数据帧添加一个名为 existing_data
的新列可能不是检查 existing_data
和 new_data
之间互补的最佳方法。如果有人有更好的建议,将不胜感激!Edit2: 问题是虽然数据帧看起来相同,但有些值的类型不同。不知何故,这个错误只在我尝试合并新数据帧的一个子集时显示。
最佳答案
我认为您正在寻找的是 concat 操作,然后是删除副本。
# 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)
这将首先创建一个包含所有旧数据和新数据的数据框,然后在第二步中删除所有重复条目。您还可以指定某些列来仅比较重复值!
请参阅此处的文档:
连接
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
关于python-3.x - 仅将数据框中的新行添加到 csv 文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59093445/