如何使用 pandas 聚合大型 DataFrame 中的多个列?

Posted

技术标签:

【中文标题】如何使用 pandas 聚合大型 DataFrame 中的多个列?【英文标题】:How do you aggregate multiple columns from large DataFrame using pandas? 【发布时间】:2021-07-22 07:26:33 【问题描述】:

我正在使用 pandas 导入一个 Excel 工作表并尝试删除给定框架存在重复区域测量的任何实例。我正在玩的工作表看起来有点像下表,其中有 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 工作表并将文件名连接到仅包含我的整个数据集的 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')

但是,当我有数百个文件复制时,手动将所有内容连接成这种格式是不可行的,然后我必须将所有内容重新分成多个列集(类似于表 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)

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

【问题讨论】:

【参考方案1】:

这是实现选项(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

【讨论】:

感谢@Arne 的帮助!我会接受你的答案,因为这有效,并且我能够将它调整到我的数据集。在将所有内容堆叠在一起之后,我需要将列解压成表格格式,类似于一切以每个文件的数据为每 3 列开始的方式。我不确定这是否是最好的方法,但我正在使用pd.df_long.unstack('filename') 再次取消堆叠所有内容。

以上是关于如何使用 pandas 聚合大型 DataFrame 中的多个列?的主要内容,如果未能解决你的问题,请参考以下文章

pandas一些基本操作(DataFram和Series)_1

pandas一些基本操作(DataFram和Series)_3

pandas一些基本操作(DataFram和Series)_4

pandas一些基本操作(DataFram和Series)_2

对从大型数据集中聚合的数据使用 Altair

Pandas 中的聚合