首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >合并列名不同但定义相同的多个CSV

合并列名不同但定义相同的多个CSV
EN

Stack Overflow用户
提问于 2019-04-16 07:02:25
回答 2查看 954关注 0票数 1

我有相似数据集的不同源(CSV),我想将其合并为单个数据并将其写入我的数据库。由于数据来自不同的来源,它们在CSV中使用不同的标题,因此我希望将这些列与逻辑意义合并。

到目前为止,我已经尝试先读取所有头文件,然后重新读取文件,以首先获得单个数据帧中的所有数据,然后执行if else操作以将具有相同含义的列合并在一起。理想情况下,我希望为每列创建一个包含所有可能的列名的映射文件,然后使用该映射读取CSV。数据在文件之间没有排序或排序。列数可能也不同,但它们都有我感兴趣的列。

示例数据:

文件1:

id,姓名,total_amount...

1,"test",123 ..

文件2:

member_id,tot_amnt,名称

2,"test2",1234..

我希望这看起来像

id,姓名,total_amount...

1,“测试”,123...

2,"test2",1234年...

..。

我想不出一个优雅的方法来做这件事,如果能得到一些指导或帮助就太好了。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-17 02:03:27

这就是我最终所做的,并发现是最干净的解决方案。谢谢你的帮助,大卫。

dict1= {'member_number': 'id', 'full name': 'name', …}
dict2= {'member_id': 'id', 'name': 'name', …}
parsers = {
   "schema1": lambda f, dict: pd.read_csv(f,index_col=False,usecols=list(dict.keys())),
   "schema2": lambda f, dict: pd.read_csv(f,index_col=False,usecols=list(dict.keys())) 
}      
map = {
    'schema1': (a_file.csv,dict1),
    'schema2': (b_file.csv,dict2)
}
total = []
for k,v in map.items():
    d = parsers[k](v[0], v[1])
    d.rename(columns=v[1], inplace=True)
    total.append(d)
final_df = pd.concat(total, sort=False)
票数 1
EN

Stack Overflow用户

发布于 2019-04-16 07:10:54

使用skiprowsheader=None跳过标题,使用names指定您自己的列名列表,使用concat合并到单个df中。即

import pandas as pd

pd.concat([
    pd.read_csv('file1.csv',skiprows=1,header=None,names=['a','b','c']),
    pd.read_csv('file2.csv',skiprows=1,header=None,names=['a','b','c'])]
)

编辑:如果不同的文件仅在列顺序上不同,则可以为names指定不同的列顺序,如果希望选择列的子集,则使用usecols。但您需要提前执行此映射,要么通过探测文件,要么通过其他一些规则。

这需要以某种方式将文件映射到处理程序

file1.csv

id, name, total_amount
1, "test", 123

file2.csv

member_id, tot_amnt, ignore, name
2, 1234, -1, "test2"

下面将选择常用的3列并重命名/重新排序。

import pandas as pd

pd.concat([
    pd.read_csv('file1.csv',skiprows=1,header=None,names=['id','name','value'],usecols=[0,1,2]),
    pd.read_csv('file2.csv',skiprows=1,header=None,names=['id','value','name'],usecols=[0,1,3])],
    sort=False
)

编辑2:

应用这一点的一个很好的方法是使用lambda和map。

parsers = {
   "schema1": lambda f: pd.read_csv(f,skiprows=1,header=None,names=['id','name','value'],usecols=[0,1,2]),
   "schema2": lambda f: pd.read_csv(f,skiprows=1,header=None,names=['id','value','name'],usecols=[0,1,3]) 
}

map = {
    "file2.csv": "schema2",
    "file1.csv": "schema1"}

pd.concat([parsers[v](k) for k,v in map.items()], sort=False)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55698344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档