如何使用 pandas 从大型 DataFrame 聚合多列?

How do you aggregate multiple columns from large DataFrame using pandas?

我正在使用 pandas 导入一个 excel 作品sheet 并尝试 删除给定帧存在重复面积测量的任何实例。我正在玩的 sheet 看起来有点像下面的 table,其中有 n 个文件,单个文件的每个帧的测量区域,以及对应于每个区域测量的帧编号.

Filename.0 Area.0 Frame.0 Filename.1 Area.1 Frame.1 ... Filename.n Area.n Filename.n
Exp327_Date_File_0 600 1 Exp327_Date_File_1 830 1 ... Exp327_Date_File_n 700 1
Exp327_Date_File_0 270 2 Exp327_Date_File_1 730 1 ... Exp327_Date_File_n 600 2
Exp327_Date_File_0 230 3 Exp327_Date_File_1 630 2 ... Exp327_Date_File_n 500 3
Exp327_Date_File_0 200 4 Exp327_Date_File_1 530 3 ... Exp327_Date_File_n 400 4
NaN NaN NaN Exp327_Date_File1 430 4 ... NaN NaN NaN

如果我手动完成 excel 工作sheet 并将文件名连接成仅包含我的整个数据集的 3 个唯一列,如下所示:

Filename Area Frame
Exp327_Date_File_0 600 1
Exp327_Date_File_0 270 2
etc... etc... etc...
Exp327_Date_File_n 530 4

我已经能够成功地使用 pandas 使用以下方法删除重复项: df_1 = df.groupby(['Filename', 'Frame Number']).agg('Area': 'sum')

但是,当我有数百个文件副本时,手动将所有内容连接成这种格式是不可行的,然后我必须将所有内容分离回多个列集(类似于数据在 Table 1).我如何 (1) 使用 pandas 创建一个新的 Dataframe,每 3 列彼此堆叠,然后我可以对其进行分组和聚合,然后再根据文件名或 (2 ) 遍历多个文件名并聚合具有多个区域的任何帧?我试过选项 2:

(row, col) = df.shape #shape of the data frame the excel file was read into
for count in range(0,round(col/3)): #iterate through the data
     aggregation_functions = {'Area.'+str(count):'sum'} #add Areas together
     df_2.groupby(['Filename.'+str(count), 'Frame Number.'+str(count)]).agg(aggregation_functions)

然而,这只是 returns 没有任何区域相加的同一个 DataFrame。任何帮助将不胜感激,如果我的问题不清楚,请告诉我

下面是实现选项(1)的方法:

import numpy as np
import pandas as pd

# sample data
df = pd.DataFrame({'Filename.0': ['Exp327_Date_File_0', 'Exp327_Date_File_0', 
                                  'Exp327_Date_File_0', 'Exp327_Date_File_0', 
                                  np.NaN], 
                   'Area.0': [600, 270, 230, 200, np.NaN],
                   'Frame.0': [1, 2, 3, 4, np.NaN],
                   'Filename.1': ['Exp327_Date_File_1', 'Exp327_Date_File_1', 
                                  'Exp327_Date_File_1', 'Exp327_Date_File_1', 
                                  'Exp327_Date_File_1'],
                   'Area.1': [830, 730, 630, 530, 430],
                   'Frame.1': [1, 1, 2, 3, 4],
                   'Filename.2': ['Exp327_Date_File_2', 'Exp327_Date_File_2', 
                                  'Exp327_Date_File_2', 'Exp327_Date_File_2', 
                                  'Exp327_Date_File_2'],
                   'Area.2': [700, 600, 500, 400, np.NaN],
                   'Frame.2': [1, 2, 3, 4, np.NaN]})

# create list of sub-dataframes, each with 3 columns, partitioning the original dataframe
subframes = [df.iloc[:, j:(j + 3)]  for j in np.arange(len(df.columns), step=3)]

# set column names to the same values for each subframe
for subframe in subframes:
    subframe.columns = ['Filename', 'Area', 'Frame']
    
# concatenate the subframes
df_long = pd.concat(subframes)
df_long
    Filename            Area    Frame
0   Exp327_Date_File_0  600.0   1.0
1   Exp327_Date_File_0  270.0   2.0
2   Exp327_Date_File_0  230.0   3.0
3   Exp327_Date_File_0  200.0   4.0
4   NaN                 NaN     NaN
0   Exp327_Date_File_1  830.0   1.0
1   Exp327_Date_File_1  730.0   1.0
2   Exp327_Date_File_1  630.0   2.0
3   Exp327_Date_File_1  530.0   3.0
4   Exp327_Date_File_1  430.0   4.0
0   Exp327_Date_File_2  700.0   1.0
1   Exp327_Date_File_2  600.0   2.0
2   Exp327_Date_File_2  500.0   3.0
3   Exp327_Date_File_2  400.0   4.0
4   Exp327_Date_File_2  NaN     NaN