gpt4 book ai didi

python - 合并具有不同列名但定义相同的多个 CSV

转载 作者:行者123 更新时间:2023-12-01 01:02:10 24 4
gpt4 key购买 nike

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

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

示例数据:
文件1:
ID、姓名、总金额...
1、“测试”,123 ..

文件2:
member_id、tot_amnt、姓名
2、“测试2”,1234 ..

我希望它看起来像

id、名称、total_amount...
1、“测试”,123...
2、“测试2”,1234...
...

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

谢谢

最佳答案

使用 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。但您需要通过探测文件或其他规则提前完成此映射。

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

文件1.csv

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

文件2.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 和映射 - 即

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)

关于python - 合并具有不同列名但定义相同的多个 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55698344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com