每天我都会收到一个 pandas 数据框,它有五列,分别是 column1column2column3column4column5 。我想将以前没有收到的行添加到我保留唯一行的文件中,称为 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_datanew_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/

    10-12 14:04
    查看更多