Python 如果组合两个csv文件时发生冲突,是否有函数可以从指定的csv文件中选择数据?

Python 如果组合两个csv文件时发生冲突,是否有函数可以从指定的csv文件中选择数据?,python,pandas,csv,Python,Pandas,Csv,我有两个csv文件,我想把这两个csv文件合并成一个csv文件。假设这两个csv文件是A.csv和B.csv,我已经知道它们之间存在一些冲突。例如,在A.csv ID“12345”中有两列ID和名称,在B.csv ID“12345”中有名称“Jack”,在B.csv ID“12345”中有名称“Tom”。因此,存在相同ID具有不同名称的冲突。现在我想保留ID“12345”,我想从A.csv中选择名称,从B.csv中放弃名称。我怎么能这么做 以下是我尝试过的一些代码,但它只能组合两个csv文件,但

我有两个csv文件,我想把这两个csv文件合并成一个csv文件。假设这两个csv文件是A.csv和B.csv,我已经知道它们之间存在一些冲突。例如,在A.csv ID“12345”中有两列ID和名称,在B.csv ID“12345”中有名称“Jack”,在B.csv ID“12345”中有名称“Tom”。因此,存在相同ID具有不同名称的冲突。现在我想保留ID“12345”,我想从A.csv中选择名称,从B.csv中放弃名称。我怎么能这么做

以下是我尝试过的一些代码,但它只能组合两个csv文件,但无法处理冲突,或者更准确地说,它无法从.csv中选择确定值:

import pandas as pd
import glob

def merge(csv_list, outputfile):
    for input_file in csv_list:
        f = open(input_file, 'r', encoding='utf-8')
        data = pd.read_csv(f, error_bad_lines=False)
        data.to_csv(outputfile, mode='a', index=False)
    print('Combine Completed')

def distinct(file):
    df = pd.read_csv(file, header=None)
    datalist = df.drop_duplicates()
    datalist.to_csv('result_new_month01.csv', index = False, header = False)
    print('Distint Completed')

if __name__ = '__main__':
    csv_list = glob.glob('*.csv')
    output_csv_path = 'result.csv'
    print(csv_list)
    merge(csv_list)
    distinct(output_csv_path)

英语不是我的母语。请原谅我的语法错误。

如果您想保留一个数据帧值而不是另一个,请保留它们,并在输出中保留第一个副本。这意味着首选值应位于您提供的序列的第一个参数中,以连接,如下所示

df = pd.DataFrame({"ID": ["12345", "4567", "897"], "name": ["Jack", "Tom", "Frank"]})
df1 = pd.DataFrame({"ID": ["12345", "333", "897"], "name": ["Tom", "Sam", "Rob"]})

pd.concat([df, df1]).drop_duplicates("ID", keep="first").reset_index(drop=True)

      ID   name
0  12345   Jack
1   4567    Tom
2    897  Frank
3    333    Sam

我会在这里写下我的评论作为回答:

merge
函数的问题是,在append模式下读取一个文件并将其写出相同的
result.csv
,而不检查重复名称。为了检查重复项,它们需要位于同一数据帧中。从您的代码中,您可以组合多个CSV文件,而不仅仅是
A.CSV
B.CSV
。所以当你说“我想从A.csv中选择名字,从B.csv中放弃名字”时,你的意思似乎是“保留第一个”

无论如何,请修复您的
merge()
函数,以保持将文件读取到数据帧列表中-首先是.csv。然后连接数据帧,只保留第一次出现

distinct()
函数中,代替
datalist=df.drop_duplicates()
,放置
datalist=df.drop_duplicates(“ID”,keep=“first”)。重置_索引(drop=True)
-但这可以在读取循环后完成,而不是写出一个充满重复项的CSV,首先删除复制,然后写入csv

下面是使用第一种方法进行的更改:

将熊猫作为pd导入
导入glob
def merge_distinct(csv_列表,输出文件):
所有_帧=[]#数据帧列表
对于csv_列表中的输入_文件:
#跳过文件打开行并将这些参数传递给pd.read\u csv
数据=pd.读取\u csv(输入\u文件,编码='utf-8',错误\u错误\u行=错误)
所有_帧。追加(数据)#追加到数据帧列表
打印('合并完成')
final=pd.concat(所有帧)。删除重复项(“ID”,keep=“first”)。重置索引(drop=True)
final.to_csv('result_new_month01.csv',index=False,header=False)
打印('Distint Completed')
如果uuuu name uuuuuu='uuuuuuu main uuuuuuuuuuuuu':
csv_list=已排序(glob.glob('*.csv'))#对列表进行排序
输出\u csv\u路径='result.csv'
打印(csv_列表)
合并不同(csv列表、输出csv路径)
注:

  • 不要执行
    f=open(…)
    只需将这些参数传递给
  • 为什么您要用
    标题=False
    写出最终的csv?这是有用的
  • 不保证排序(取决于文件系统),所以我在上面使用了
    sorted()
  • 文件系统排序不同于仅按
    排序
    排序,后者本质上是按ASCII/Unicode索引顺序排序

如果每个文件的ID都是唯一的,请将它们用作字典键,并将名称用作字典值。由于您希望A.csv中的值优先于B.csv中的值,请先处理B.csv,然后执行A.csv,这样最终值将是两个文件的并集,对于冲突ID,将是A.csv中的一个。最后,将最后一本字典写到最后一个csv文件中。如果您显示了一些工作代码/您尝试过的内容,或a,那么我们可以帮助您显示解决问题的代码。有关更多信息,请参阅,并使用@aneroid,我理解,但熊猫是否有这样做的方法?我已经发布了我的代码,非常感谢!好的,我之前没有注意到熊猫的标签。现在您已经添加了代码,添加每个CSV的一个小样本(5行),包括一个重叠。两个CSV中的列是否相同?只有ID和名称?你真的要合并,还是要删除这些文件?