Python 如果组合两个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中选择确定值: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文件,但
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(…)
- 为什么您要用
写出最终的csv?这是有用的标题=False
- 不保证排序(取决于文件系统),所以我在上面使用了
sorted()
- 文件系统排序不同于仅按
排序,后者本质上是按ASCII/Unicode索引顺序排序排序