在每个数据帧中合并

2024-05-16 00:47:14 发布

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

我在多个文件夹中有.csv个文件,如下所示:

文件1

Count    2002_Crop_1   2002_Crop_2   Ecoregion
 20      Corn          Soy           46
 15      Barley        Oats          46

文件2

^{pr2}$

对于每个文件夹,我要合并其中的所有文件。在

我想要的输出是这样的:

Crop_1  Crop_2 2002_Count  2003_Count  Ecoregion
Corn    Soy    20          24          46
Barley  Oats   15          18          46  

实际上,每个文件夹中有10个文件需要合并,而不仅仅是2个。在

我现在使用的代码是:

import pandas as pd, os
#pathway to all the folders
folders=r'G:\Stefano\CDL_Trajectory\combined_eco_folders'
for folder in os.listdir(folders):
    for f in os.listdir(os.path.join(folders,folder)):   
            dfs=pd.read_csv(os.path.join(folders,folder,f))   #turn each file from each folder into a dataframe
            df = reduce(lambda left,right: pd.merge(left,right,on=[dfs[dfs.columns[1]], dfs[dfs.columns[2]]],how='outer'),dfs) #merge all the dataframes based on column location

但这会带来: TypeError: string indices must be integers, not Series


Tags: 文件csvcrop文件夹oscountfolderfolders
1条回答
网友
1楼 · 发布于 2024-05-16 00:47:14
  • 使用glob.glob到{a1}。

  • 如果可以的话,尽量避免重复调用pd.merge。对pd.merge的每次调用都会创建一个新的数据帧。因此,每个中间结果中的所有数据都必须复制到新的数据帧中。在循环中执行此操作会导致quadratic copying,这对性能不利。

  • 例如,如果您要更改列名

    ['Count', '2002_Crop_1', '2002_Crop_2', 'Ecoregion']
    

    ^{pr2}$

    然后,您可以使用['Crop_1', 'Crop_2', 'Ecoregion']作为每个数据帧的索引,并将所有数据帧与一个对^{的调用结合起来。


import pandas as pd
import glob

folders=r'G:\Stefano\CDL_Trajectory\combined_eco_folders'
dfs = []

for filename in glob.glob(os.path.join(folders, *['*']*2)):
    df = pd.read_csv(filename, sep='\s+')
    columns = [col.split('_', 1) for col in df.columns]

    prefix = next(col[0] for col in columns if len(col) > 1)
    columns = [col[1] if len(col) > 1 else col[0] for col in columns]
    df.columns = columns

    df = df.set_index([col for col in df.columns if col != 'Count'])
    df = df.rename(columns={'Count':'{}_Count'.format(prefix)})

    dfs.append(df)

result = pd.concat(dfs, axis=1)
result = result.sortlevel(axis=1)
result = result.reset_index()
print(result)

收益率

   Crop_1 Crop_2  Ecoregion  2002_Count  2003_Count
0    Corn    Soy         46          20          24
1  Barley   Oats         46          15          18

相关问题 更多 >