计算数据帧groupby列和联接结果的最小最大平均值

2024-04-26 13:29:20 发布

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

我有一个pandas数据帧,我想对一列执行min,max,mean,median计算,使用列a,B和C对它们进行分组。 然后我想将结果合并到初始数据帧。 当我计算中位数时,我成功地使用了下面的方法:

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')

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

ValueError:列重叠但未指定后缀: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')

我已经尝试使用sufixe,它会工作,但我想使用我自己的列全名。或者我必须在使用后重命名?你知道吗

另外,我认为有一种方法可以将请求作为数组:[np最小值, np.平均值, np.中位数, np最大值],使用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')



After having received great answer, just a comment.
I was trying to use the bellow which was triggering a lot of warnings and was slower than the solution proposed:

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')

Tags: csvpandasdfsqlnpbuyresultzip
1条回答
网友
1楼 · 发布于 2024-04-26 13:29:20

当您需要将columns添加到原始dfs时,您可以始终使用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')

相关问题 更多 >