python pandas合并多个csv文件

2024-05-15 04:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有大约600个csv文件数据集,所有数据集都有非常相同的列名['DateTime'、'Actual'、'Consensus'、'Previous'、'Revised'],所有经济指标和所有时间序列数据集。

目的是将它们合并到一个csv文件中。

以“DateTime”作为索引。

我希望此文件索引的方式是时间线方式,也就是说,第一个csv事件的日期是2017年12月18日10:00:00,第二个csv事件的日期是2017年12月29日09:00:00,第三个csv事件的日期是2017年12月20日09:00:00。

所以,我想先对它们进行索引,然后再对它们进行索引,等等,尽管它最初来自csv源。

我试图将其中的三个合并为一个实验,问题是“DateTime”,因为它将其中的三个打印在一起,如下所示(“12/18/2017 10:00:00”、“12/29/2017 09:00:00”、“12/20/2017 09:00:00”) 代码如下:

import pandas as pd


df1 = pd.read_csv("E:\Business\Economic Indicators\Consumer Price Index - Core (YoY) - European Monetary Union.csv")
df2 = pd.read_csv("E:\Business\Economic Indicators\Private loans (YoY) - European Monetary Union.csv")
df3 = pd.read_csv("E:\Business\Economic Indicators\Current Account s.a - European Monetary Union.csv")

df = pd.concat([df1, df2, df3], axis=1, join='inner')
df.set_index('DateTime', inplace=True)

print(df.head())
df.to_csv('df.csv')

Tags: 文件csv数据dfreaddatetime时间事件
3条回答

问题有两个方面:将csv合并到单个数据帧中,然后按日期排序。

正如John Smith指出的那样,要沿着行合并数据帧,需要使用:

df = pd.concat([df1,df2,df3])

然后,您需要设置一个索引,并根据该索引对数据帧重新排序。

df.set_index('DateTime', inplace=True)
df.sort_index(inplace=True)

或按降序排列

df.sort_index(inplace=True,ascending=False)

(见https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_index.html


timeindex = pd.date_range('2018/01/01','2018/01/10')
randtimeindex = np.random.permutation(timeindex)
# Create three dataframes
df1 = pd.DataFrame(index=range(3),data=np.random.rand(3,3),
                columns=['Actual','Consensus','DateTime'])
df1.DateTime=randtimeindex[:3]
df2 = pd.DataFrame(index=range(3),data=np.random.rand(3,3),
                columns=['Actual','Consensus','DateTime'])
df2.DateTime=randtimeindex[3:6]
df3 = pd.DataFrame(index=range(4),data=np.random.rand(4,3),
                columns=['Actual','Consensus','DateTime'])
df3.DateTime=randtimeindex[6:]

# Merge them
df4 = pd.concat([df1, df2, df3], axis=0)

# Reindex the merged dataframe, and sort it
df4.set_index('DateTime', inplace=True)
df4.sort_index(inplace=True, ascending=False)

print(df4.head())

您正在尝试从许多具有相同列名的数据帧的行中构建一个大型数据帧。axis应该是0(默认值),而不是1。另外,不需要指定联接类型。这不会有任何效果,因为每个数据帧的列名都是相同的。

df = pd.concat([df1, df2, df3])

应该足够连接数据集。

(见https://pandas.pydata.org/pandas-docs/stable/merging.html

然后,调用set_index以使用DateTime列中的值定义索引应该可以工作。

考虑使用^{}args、index-colparse-dates在导入期间创建索引并格式化为datetime。然后运行所需的水平合并。下面假设日期在csv的第一列。最后在最终数据帧上使用^{}对日期时间进行排序。

df1 = pd.read_csv(r"E:\Business\Economic Indicators\Consumer Price Index - Core (YoY) - European Monetary Union.csv",
                  index_col=[0], parse_dates=[0])
df2 = pd.read_csv(r"E:\Business\Economic Indicators\Private loans (YoY) - European Monetary Union.csv",
                  index_col=[0], parse_dates=[0])
df3 = pd.read_csv(r"E:\Business\Economic Indicators\Current Account s.a - European Monetary Union.csv",
                  index_col=[0], parse_dates=[0])

finaldf = pd.concat([df1, df2, df3], axis=1, join='inner').sort_index()

对于DRY-er方法,特别是在数百个csv文件中,使用列表理解

import os
...
os.chdir('E:\\Business\\Economic Indicators')

dfs = [pd.read_csv(f, index_col=[0], parse_dates=[0])
        for f in os.listdir(os.getcwd()) if f.endswith('csv')]

finaldf = pd.concat(dfs, axis=1, join='inner').sort_index()

相关问题 更多 >

    热门问题