python-3.x - 如何使用 Python 3.7 将不同结构的 CSV 文件合并为一个?
问题描述
我面临以下挑战:
我的 Python 项目目录中有 300 个不同的 CSV 文件,它们都具有不同的结构,即不同的列,并且希望将所有这些文件组合成一个统一的 CSV 文件。
让我举一个2文件的例子:
市值.csv:
marketcap,ticker
1000,AAPL
2000,TSLA
3000,OSTK
收入.csv:
revenue,ticker
2000,AAPL
300,MDXG
合并的 csv 文件的结构应如下所示:
合并的.csv:
marketcap,revenue,ticker
1000,2000,AAPL
2000,0,TSLA
3000,0,OSTK
0,300,MDXG
我有 300 个不同列(所有已知)的完整列表,并且有 300 个生成的 CSV 文件。代码事先不知道。正如您从上面的示例中看到的,每个文件中的可用代码可能会有所不同,即,如果代码未在一个文件中列出,它应该自动为合并文件中的相应数据点(例如收入)获得 0。
我已经搜索了 stackoverflow,但没有找到这个特定问题的答案。感谢您提供有关如何解决此问题的帮助和想法。
解决方案
对于当前示例,使用 pandas 数据框的单行代码效果很好。您需要为每个文件提供公共列,以查看它对这 300 个文件的工作方式。
对于较小的数据集
当您知道文件中的常见列时:
# 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 个文件的代码
这段代码在合并之前搜索两个数据框中的公共列。
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)
推荐阅读
- python - 为什么我的语法颜色在 Visual Studio Code 中发生了变化?
- go - 使用一个接口抽象多个数据源供存储库使用
- c# - 无法在实时聊天信号器中获取收件人消息
- python - 如何在 Tkinter 中获取选定的格式?
- r - 使用 ggplot 进行变化点检测
- angular - 在 Angular 组件中测试 IntersectionObserver
- python - 如何使服务器响应字典列表?
- json - 有没有更好的方法来服务和编码来自 FastAPI 的大型 SQLAlchemy 数据集?
- python - 将 SQLite3 数据库中的所有表合并到一个 pandas 数据框中
- javascript - NaN 同时使用 momentjs 找到差异