【问题标题】:Combine multiple csv files column wise with the header as file name将多个 csv 文件按列与标题组合为文件名
【发布时间】:2021-11-29 19:01:24
【问题描述】:

我在平台上找不到确切的代码,这就是为什么发布它以征求建议。

我有多个数据格式和标题名称相同的 CSV 文件(大约 100 个)。

 ,Mean,SD
1,96.432,13.899
2,96.432,13.899
3,96.432,13.899
4,96.432,13.899
5,96.432,13.899

我想逐列附加所有文件,以便将它们放在一个文件中。此外,每个数据的标题应该是文件名,以便我可以跟踪哪些数据属于哪个文件。比如上面的意思,sd-->文件名的另一行。

请指导我,因为我是 Python 新手。

谢谢和问候, 汗。

【问题讨论】:

  • 你能提供一个预期输出的例子吗? (例如对于 2 个文件,“file1.csv”和“file2.csv”)
  • 感谢您的评论。我想要如下的输出。 BT - N - 015 BT - N - 013 BT - N - 012 ,Mean,SD ,Mean,SD ,Mean,SD 1,96.432,13.899 1,107.068,20.890 1,105.122,31.229 2,96.432,13.899 2,107.068.32,2.3 107.068.32,289 ,96.432,13.899 3,107.068,20.890 3,105.122,31.229 4,96.432,13.899 4,107.068,20.890 4,105.122,31.229 5,96.432,13.899 5,107.068,20.890 5,105.122,31.229 6,96.432,13.899 6,107.068,20.890 6,105.122,31.229 7,96.432,13.899 7,107.068, 20.890 7,105.122,31.229 8,96.432,13.899 8,107.068,20.890 8,105.122,31.229 第一个单元格显示文件名
  • 恐怕我无法理解您对输出文件的规格,能否请edit您的问题,可能会添加预期输出的示例?
  • @Khan 请编辑您的问题并将输出作为文本提供
  • 第一个 csv (BT - N - 015) 有数据:,Mean,SD 1,96.432,13.899 2,96.432,13.899 3,96.432,13.899 4,96.432,13.899 5,96.432,13.899 6 ,96.432,13.899 7,96.432,13.899 8,96.432,13.899 9,96.432,13.899 10,96.432,13.899 11,96.432,13.899 等等...

标签: python csv


【解决方案1】:

关于格式的问题含糊不清,因此这可能与所需的输出有所不同。

filenames = [...]
dfs = []
for f in filenames:
    newdf = pd.read_csv(f)
    newdf.rename(columns={'Mean': 'Mean ' + f, 'SD': 'SD ' + f})
    dfs.append(newdf)
df = pd.concat(dfs)

【讨论】:

  • 这不会执行按列连接
【解决方案2】:

您可以使用pandas 来读取和连接文件,同时使用glob 和字典理解:

from glob import glob
import pandas as pd

files = glob('/tmp/*.csv') # change the location/pattern accordingly
# if you have a list of files, use: files=['file1.csv', 'file2.csv'...]

df = pd.concat({fname.rsplit('/')[-1]: pd.read_csv(fname, index_col=0)
                for fname in files}, axis=1)

输出:

>>> print(df)
  file1.csv         file2.csv        
       Mean      SD      Mean      SD
                                     
1    96.432  13.899    96.432  13.899
2    96.432  13.899    96.432  13.899
3    96.432  13.899    96.432  13.899
4    96.432  13.899    96.432  13.899
5    96.432  13.899    96.432  13.899

保存到新文件:

df.to_csv('concatenated_file.csv')

输出:

,file1.csv,file1.csv,file2.csv,file2.csv
,Mean,SD,Mean,SD
 ,,,,
1,96.432,13.899,96.432,13.899
2,96.432,13.899,96.432,13.899
3,96.432,13.899,96.432,13.899
4,96.432,13.899,96.432,13.899
5,96.432,13.899,96.432,13.899

【讨论】:

  • 谢谢,但我收到错误“ValueError: No objects to concatenate”
  • 我猜你使用了files = glob('/tmp/*.csv') 但你可能没有/tmp 中的文件,更改代码以使用你的文件夹
  • 我已将其更改为'/home/user/khan/Desktop/check/*.csv'
  • 好的,它是否按您的预期工作?请注意,如果将读取 所有 check 文件夹中的 csv 文件,并使用全名作为标题(我将更新答案以仅保留文件名)
  • 没有。正如我提到的“没有要连接的对象”,它给出了错误。感谢您将全名更改为标题,但为什么它给我这个错误?是的,我想合并 check 文件夹中的所有 csv 文件。
【解决方案3】:

您可以使用 pandas 来处理

In [3]: import pandas  

                                                                                                                           

In [4]: import pandas as pd                                                                                                                           

In [13]: ls                                                                                                                                           
abc1.csv  abc.csv

In [14]: df = pd.read_csv('abc.csv')                                                                                                                  

In [15]: df1 = pd.read_csv('abc1.csv')                                                                                                                

In [16]: df                                                                                                                                           
Out[16]: 
        Mean      SD
0  1  96.432  13.899
1  2  96.432  13.899


In [16]: df                                                                                                                                           
Out[16]: 
        Mean      SD
0  1  96.432  13.899
1  2  96.432  13.899

In [17]: df1                                                                                                                                          
Out[17]: 
        Mean      SD
0  3  96.432  13.899
1  4  96.432  13.899
2  5  96.432  13.899

In [18]: df.append(df1)                                                                                                                               
Out[18]: 
        Mean      SD
0  1  96.432  13.899
1  2  96.432  13.899
0  3  96.432  13.899
1  4  96.432  13.899
2  5  96.432  13.899

In [19]: ds = df.append(df1)                                                                                                                          

In [20]: ds                                                                                                                                           
Out[20]: 
        Mean      SD
0  1  96.432  13.899
1  2  96.432  13.899
0  3  96.432  13.899
1  4  96.432  13.899
2  5  96.432  13.899



In [21]: ds.to_csv('file1.csv')  


In [23]: ls                                                                                                                                           
abc1.csv  abc.csv  file1.csv

处理多个文件

In [82]: import  pandas as pd                                                                                                                         

In [83]: import os, glob                                                                                                                              

In [84]: s = glob.glob(os.path.join(os.getcwd(),'*.csv'))                                                                                             

In [85]: s                                                                                                                                            
Out[85]: 
['/home/thinkpad/Desktop/stackoverflow/abc1.csv',
 '/home/thinkpad/Desktop/stackoverflow/abc.csv']


In [90]: df = pd.DataFrame(columns = ['in','Mean','SD']) 
    ...: for i in s: 
    ...:     df1 = pd.read_csv(i) 
    ...:     print(df1.head()) 
    ...:     df = df.append(df1) 

In [91]: df                                                                                                                                           
Out[91]: 
  in    Mean      SD
0  3  96.432  13.899
1  4  96.432  13.899
2  5  96.432  13.899
0  1  96.432  13.899
1  2  96.432  13.899

【讨论】:

  • 有 100 个文件 ;)
  • 感谢您的建议。我有多个文件,100 个左右;如何将它们重命名为不同的数据框。我可以使用此代码作为数据框进行自我命名吗?
  • 亲爱的先生,我已经解决了你的问题,现在你可以看看,现在你的文件夹可以有 100 个或 1000 个它会非常顺利地工作。谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2021-12-03
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2019-10-11
相关资源
最近更新 更多