【问题标题】:Importing multiple csv files into a concatenated dataframe with each column appended in the dataframe将多个 csv 文件导入连接的数据框中,每列附加在数据框中
【发布时间】:2018-10-01 17:50:36
【问题描述】:

我有很多这样的 csv 文件:

file_1.csv

name  num
Ab     8
Dd     9
Cc     20
Kk     69

file_2.csv

name  num
Ab    23
Dd    3
Kk    20
Jj    30

等等…… 现在,您会看到有一个名称可能不会出现在第一个 csv 中,但会出现在其他一些 csv 中。

现在,我最关心的是将它们全部放在一个数据帧中(连接),如下所示: big_df

name num num2 num3....numN
 Ab   8    23   ...
 Dd   9     3   ...

其中 N 是具有 num 列的 csv 文件的数量


我在寻找解决方案时进行了相当多的研究,这就是我得到的:

path = 'E:\\my_path\\**\\*.csv'
all_rec = iglob(path, recursive = True)
dataframes = (pd.read_csv(f, sep = ';', skiprows = 1, header = None) for f in all_rec)
big_df = pd.concat(dataframes, ignore_index = True)

真的不适合我。

【问题讨论】:

  • 文件命名约定真的不同(有些可以有下划线,有些可能没有)还是您的问题中的拼写错误?他们的名字中都有数字吗?这是唯一的数字吗?
  • 不,它们是相同的(都有下划线和后续编号)。
  • pd.concat(dataframes, ignore_index = True, axis = 1)
  • @AjayShah '没有要连接的对象'
  • 在定义数据帧的前几行中使用 [] 而不是 ()。 pd.concat 获取数据帧列表。

标签: python pandas csv dataframe data-analysis


【解决方案1】:

根据需要获取文件列表。不知道你那个目录下有没有其他的.csv文件,如有需要请修改。

这里的关键是您要将name 设置为索引,这样pd.concat 在您加入它们时使用它来对齐DataFrames。您可以使用regex 获取文件编号,然后将其附加到列名。

import os
import re
import pandas as pd

path = 'define_your_path'
files = [x for x in os.listdir(path) if '.csv' in x]
#['file_1.csv', 'file_2.csv']

lst = []
for f in files:
    lst.append(pd.read_csv(path+f)
                 .set_index('name')
                 .add_suffix(re.search('.*_(.*)\.', f).group(1)))

big_df = pd.concat(lst, axis=1, sort=False)

输出:big_df

    num1  num2
Ab   8.0  23.0
Dd   9.0   3.0
Cc  20.0   NaN
Kk  69.0  20.0
Jj   NaN  30.0

输入数据:

file_1.csv:

name,num
Ab,8
Dd,9
Cc,20
Kk,69

file_2.csv:

name,num
Ab,23
Dd,3
Kk,20
Jj,30

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    相关资源
    最近更新 更多