如何使用 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
我正在使用 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