【问题标题】:Calculate min max mean median for pandas DataFrame groupby Columns and join results计算pandas DataFrame groupby Columns的最小最大平均中位数并连接结果
【发布时间】:2019-12-13 12:00:23
【问题描述】:

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

我已尝试使用后缀,它会起作用,但我想使用我自己的列全名。还是我一定要在使用后重命名?

同样,我相信有一种方法可以将请求作为数组:[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')

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    当您需要将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')
    

    【讨论】:

    • 谢谢,我打算使用波纹管,它会触发很多警告:
    • 我有 400k 行。每个转换调用大约需要一分钟。有没有办法一次计算最小最大平均列?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    相关资源
    最近更新 更多