【问题标题】:python pandas merge multiple csv filespython pandas合并多个csv文件
【发布时间】:2018-06-11 13:50:18
【问题描述】:

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

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

以“日期时间”为索引。

我希望此文件索引的方式是时间线方式,这意味着假设第一个 csv 中的第一个事件日期为 2017 年 12 月 18 日 10:00:00,第二个 csv 中的第一个事件日期为 12 /29/2017 09:00:00 和第三个 csv 中的第一个事件日期为 2017 年 12 月 20 日 09:00:00。

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

我尝试仅合并其中的 3 个作为实验,问题是“DateTime”,因为它像这样将它们中的 3 个打印在一起('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')

【问题讨论】:

  • 你能举一个输入输出的例子吗?

标签: python pandas csv datetime


【解决方案1】:

考虑使用read_csv() args、index_colparse_dates,在导入期间创建索引并格式化为日期时间。然后运行您需要的水平合并。下面假设日期在 csv 的第一列。最后在最终数据帧上使用sort_index() 对日期时间进行排序。

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()

【讨论】:

  • 谢谢你,我试了你的代码,结果是空集,我把 join arg 改成 'outer' 代码就可以了
  • 听起来不错。我几乎根据你的一个 cmets 改变了它。乐意效劳。编码和新年快乐!
【解决方案2】:

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

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

应该足以连接数据集。

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

您调用 set_index 使用 DateTime 列中的值定义索引应该会起作用。

【讨论】:

  • 你误会了兄弟,这些是具有不同时间步长的不同经济指标,如果这些文件是 10 个,每个有 5 列,这意味着我需要 50 列来保持它们的可识别性,所以我不能只是让他们失明。我需要一个新数据集包含原始数据集的所有读数,所以如果事件 1 在时间 x 和事件 2 在时间 y 如果 x 和 y 在同一时间将它们添加到同一行,但每个都在其列中,如果尽管有源数据集,但它们的行和列中的每个时间都不同,然后按时间索引它们(先是后,最后是新的)。
  • 那么在调用pd.concat之前,你需要在数据帧df1、df2、df3上使用set_index('DateTime', inplace=True)
【解决方案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())

【讨论】:

    【解决方案4】:
    dataset_1 = pd.read_csv('csv path')
    dataset_2 = pd.read_csv('csv path')
        
    new_dataset = pd.merge(dataset_1, dataset_2, left_on='same column name', right_on=('same column name'), how=('how to join ex:left'))
    

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 2019-01-28
      • 1970-01-01
      • 2019-02-22
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 2019-11-14
      相关资源
      最近更新 更多