首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Python 3.7将不同结构的CSV文件合并为一个文件?

如何使用Python 3.7将不同结构的CSV文件合并为一个文件?
EN

Stack Overflow用户
提问于 2018-12-04 22:26:14
回答 1查看 378关注 0票数 0

我面临着以下挑战:

我的Python项目目录中有300个不同的CSV文件,它们都具有不同的结构,即不同的列,我希望将所有这些文件合并到一个统一的CSV文件中。

让我举一个两个文件的例子:

marketcap.csv:

代码语言:javascript
复制
marketcap,ticker
1000,AAPL
2000,TSLA
3000,OSTK

revenue.csv:

代码语言:javascript
复制
revenue,ticker
2000,AAPL
300,MDXG

整合的csv文件的结构应如下所示:

consolidated.csv:

代码语言:javascript
复制
marketcap,revenue,ticker
1000,2000,AAPL
2000,0,TSLA
3000,0,OSTK
0,300,MDXG

我有一个300个不同列的完整列表(都是已知的),并且有300个结果CSV文件。这些报价器事先是未知的。正如您从上面的示例中看到的,每个文件中的可用报价器可能会有所不同,即,如果一个报价器没有在一个文件中列出,那么它应该自动为合并文件中的各个数据点获得0。

我搜索了stackoverflow,但没有找到这个特定问题的答案。感谢你的帮助和关于如何解决这个问题的想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-04 22:49:45

对于当前的示例,使用pandas dataframe的一行程序运行得很好。您需要为每个文件提供公共列,以查看它对这300个文件的工作方式。

对于较小的数据集

当您知道文件中的公共列时:

代码语言:javascript
复制
# Create dataframes from csv:
market = pd.read_csv("filepath/market.csv")filepath/market.csv")
revenue = pd.read_csv("filepath/revenue.csv")

# Merge both files using pd.merge
consolidated = market.merge(revenue,how='outer', on='ticker').fillna(value=0)
# This gives a full merge of both csv and fillna replaces null values with '0'

更新了300个文件的代码

这段代码在合并之前搜索两个数据帧中的公共列。

代码语言:javascript
复制
import glob
import pandas as pd

directory = 'C:/Test' # specify the directory containing the 300 files
filelist = sorted (glob.glob(directory + '/*.csv')) # reads all 300 files in the directory and stores as a list
consolidated = pd.DataFrame() # Create a new empty dataframe for consolidation
for file in filelist:            # Iterate through each of the 300 files
    df1 = pd.read_csv(file)      # create df using the file  
    df1col = list (df1.columns)  # save columns to a list
    df2 = consolidated           # set the consolidated as your df2
    df2col = list (df2.columns)  # save columns from consolidated result as list
    commoncol = [i for i in df1col for j in df2col if i==j] # Check both lists for common column name
    # print (commoncol)
    if commoncol == []:          # In first iteration, consolidated file is empty, which will return in a blank df
        consolidated = pd.concat([df1, df2], axis=1).fillna(value=0)  # concatenate (outer join) with no common columns replacing null values with 0
    else:
        consolidated = df1.merge(df2,how='outer', on=commoncol).fillna(value=0)        # merge both df specifying the common column and replace null values with 0
    # print (consolidated)   << Optionally, check the consolidated df at each iteration 

# writing consolidated df to another CSV
consolidated.to_csv('C:/<filepath>/consolidated.csv', header=True, index=False)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53615095

复制
相关文章

相似问题

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