对于 Pandas DataFrame 进行分组后,计算每个组的最小值、最大值、平均值和中位数,并将结果合并。

4
我有一个pandas DataFrame,想在一列上执行最小值、最大值、平均值、中位数的计算,使用A、B和C列进行分组。 然后我想将结果合并到初始DataFrame中。 当我计算中位数时,我成功地使用了以下内容:
pandas_df: pd.DataFrame = my_pandas_sql.pull_data_from_mysqldb(query=sql_string)
median_px = pandas_df.groupby(['ZIP', 'Updated', 'Buy/Rent'])[['Px/SQM']].apply(np.median)
median_px.name = 'Median Px/SQM'
result_median_df = pandas_df.join(median_px, on=['ZIP', 'Updated', 'Buy/Rent'], how="left")
result_median_df.to_csv(path_or_buf='median.csv')

但是当我尝试计算最小值和最大值并将其添加到DataFrame时,出现以下错误:

ValueError: columns overlap but no suffix specified: Index(['Px/SQM'], dtype='object')

用于计算最小值或最大值的代码:
pandas_df: pd.DataFrame = my_pandas_sql.pull_data_from_mysqldb(query=sql_string)
min_px = pandas_df.groupby(['ZIP', 'Updated', 'Buy/Rent'])[['Px/SQM']].apply(np.min)
min_px.name = 'Min Px/SQM'
result_min_df = pandas_df.join(min_px, on=['ZIP', 'Updated', 'Buy/Rent'], how="left")
result_min_df.to_csv(path_or_buf='min_px.csv')

我尝试使用后缀,它可以工作,但我想使用我的自定义列fullname。或者说我必须在使用后重命名吗?
此外,我相信有一种方法可以将请求作为数组:[np.min,np.mean,np.median,np.max],并使用agg重命名列,但我无法使其工作。
链接:
pandas_df: pd.DataFrame = my_pandas_sql.pull_data_from_mysqldb(query=sql_string)
min_px = pandas_df.groupby(['ZIP', 'Updated', 'Buy/Rent'])[['Px/SQM']].apply(np.min)
min_px.name = 'Min Px/SQM'
result_min_df = pandas_df.join(min_px, on=['ZIP', 'Updated', 'Buy/Rent'], how="left", lsuffix="_min")
result_min_df.to_csv(path_or_buf='min_px.csv')

在得到了很好的答案后,只是想评论一下。
我试图使用这里显示的代码,但触发了很多警告,并且比提出的解决方案慢:
df1=pandas_df.groupby(['ZIP', 'Updated', 'Buy/Rent']).agg({'Px/SQM':                                                                   {'Min': np.min,'Max': np.max,'Mean': np.mean,'Median': np.median                                                                  }} ).reset_index()df3= pd.merge(pandas_df, df1, on=['ZIP', 'Updated', 'Buy/Rent'], how='left')
1个回答

2
当您需要向原始数据框添加列时,您可以始终使用"transform"。最初的回答。
g=pandas_df.groupby(['ZIP', 'Updated', 'Buy/Rent'])['Px/SQM']

pandas_df['Max']=g.transform('max')
pandas_df['Min']=g.transform('min')
pandas_df['Median']=g.transform(np.median)
pandas_df['Mean']=g.transform('mean')

谢谢,我原本打算使用下面的代码,但是它会触发很多警告: - Je Je
1
我有四十万行数据。每个转换调用大约需要一分钟的时间。有没有一种方法可以在一个步骤中计算最小值、最大值和平均值列? - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接