我有一个文件夹,里面有大约40个CSV文件,每个月都包含数据。我想把这一切结合在一起,但我在这些CSV文件中有一列,要么表示为"implementationstatus",要么表示"implementation"。当我尝试使用Pandas进行concat时,显然这是一个问题。我想在导入每个CSV文件时,基本上将其"implementationstatus"更改为"implementation"。我可以为每个CSV文件运行一个循环,更改列名,导出它,然后在所有更改的情况下再次运行我的代码,但这似乎很容易出错或发生意外的事情。
相反,我只想导入所有CSV,将列名"implementationstatus"更改为"implementation"(如果适用(,然后连接到一个数据帧中。我的代码在下面。
import pandas as pd
import os
import glob
path = 'c:/mydata'
filepaths = [f for f in os.listdir(".") if f.endswith('.csv')]
df = pd.concat(map(pd.read_csv, filepaths),join='inner', ignore_index=True)
df.columns = df.columns.str.replace('implementationstatus', 'implementation') # I know this doesn't work, but I am trying to demonstrate what I want to do
如果您想更改列名,请尝试以下操作:
import glob
import pandas as pd
filenames = glob.glob('c:/mydata/*.csv')
all_data = []
for file in filenames:
df = pd.read_csv(file)
if 'implementationstatus' in df.columns:
df = df.rename(columns={'implementationstatus':'implementation'})
all_data.append(df)
df_all = pd.concat(all_data, axis=0)
您可以使用pd.read_csv函数中的标头和名称参数组合来解决此问题。
您必须向name传递一个列表,该列表包含csv文件上所有列的名称。这将允许您标准化所有名称。
来自熊猫文档:名称:类似数组,可选要使用的列名列表。如果文件包含标题行,则应显式传递header=0以覆盖列名。此列表中不允许有重复项。