Python 如何展平数据帧GroupBy

Python 如何展平数据帧GroupBy,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个DataFrameGroupBy类型的分组对象。我想用它来聚合一些数据,如下所示: 聚合=分组。聚合[np.sum,np.mean],轴=1 这将返回以下格式的数据帧: 聚合的[:3]。到 {'VALUE1','sum':{ “US10adam034”,“PRCP”:701, “US10adam036”,“PRCP”:1015, “US10adam036”,“SNOW”:46}, “值1”、“平均值”:{ “US10adam034”,“PRCP”:100.14285714285714,

我有一个DataFrameGroupBy类型的分组对象。我想用它来聚合一些数据,如下所示:

聚合=分组。聚合[np.sum,np.mean],轴=1 这将返回以下格式的数据帧:

聚合的[:3]。到 {'VALUE1','sum':{ “US10adam034”,“PRCP”:701, “US10adam036”,“PRCP”:1015, “US10adam036”,“SNOW”:46}, “值1”、“平均值”:{ “US10adam034”,“PRCP”:100.14285714285714, “US10adam036”,“PRCP”:145.0, 'US10adam036','SNOW':46.0} 打印出磁头会产生以下结果:

                    VALUE1            
                       sum        mean
ID          ELEMENT                   
US10adam034 PRCP       701  100.142857
US10adam036 PRCP      1015  145.000000
            SNOW        46   46.000000
US10adam046 PRCP       790  131.666667
US10adam051 PRCP         5    0.555556
US10adam056 PRCP       540   31.764706
            SNOW        25    1.923077
            SNWD       165   15.000000
这很有效。它可以轻松地为我的样本计算总和和平均值,其中分组索引是ID,ELEMENT。但是,我真的希望将其转换为单行格式,其中ID是唯一的,列是ELEMENT&sum | mean的组合。我几乎可以像这样使用apply到达那里:

def getNewSeriest: 类型=>系列 element=t.name[1]t.name是元组“ID”,“element” sum_index=f'{element}sum' mean_index=f'{element}mean' 返回pd.Seriest['VALUE1'].值,索引=[求和索引,平均索引] aggregated.applygetNewSeries,axis=1,结果\u type='expand' 再次打印头部,我得到:

                       PRCPmean  PRCPsum   SNOWmean  SNOWsum  SNWDmean  ...
ID          ELEMENT                                                      
US10adam034 PRCP     100.142857    701.0        NaN      NaN       NaN   
US10adam036 PRCP     145.000000   1015.0        NaN      NaN       NaN   
            SNOW            NaN      NaN  46.000000     46.0       NaN   
US10adam046 PRCP     131.666667    790.0        NaN      NaN       NaN   
US10adam051 PRCP       0.555556      5.0        NaN      NaN       NaN   
US10adam056 PRCP      31.764706    540.0        NaN      NaN       NaN   
            SNOW            NaN      NaN   1.923077     25.0       NaN   
            SNWD            NaN      NaN        NaN      NaN      15.0   
我希望我的最终数据帧如下所示:

有没有一种方法可以使用apply、agg或transform将这些数据聚合成单行?我也尝试过在唯一ID上创建自己的迭代器,但速度非常慢。我喜欢使用agg计算总和/平均值的简便性。

您可以:

new_df = agg_df.unstack(level=1)
new_df.columns = [c+b for _,b,c in new_df.columns.values]
输出:

             PRCPsum  SNOWsum    PRCPmean  SNOWmean
US10adam034    701.0      NaN  100.142857       NaN
US10adam036   1015.0     46.0  145.000000      46.0
             PRCPsum  SNOWsum    PRCPmean  SNOWmean
US10adam034    701.0      NaN  100.142857       NaN
US10adam036   1015.0     46.0  145.000000      46.0
你可以做:

new_df = agg_df.unstack(level=1)
new_df.columns = [c+b for _,b,c in new_df.columns.values]
输出:

             PRCPsum  SNOWsum    PRCPmean  SNOWmean
US10adam034    701.0      NaN  100.142857       NaN
US10adam036   1015.0     46.0  145.000000      46.0
             PRCPsum  SNOWsum    PRCPmean  SNOWmean
US10adam034    701.0      NaN  100.142857       NaN
US10adam036   1015.0     46.0  145.000000      46.0
IIUC

IIUC


请检查重置索引是否按照您的需要工作

aggregated.apply(getNewSeries, axis=1, result_type='expand').reset_index()

请检查重置索引是否按照您的需要工作

aggregated.apply(getNewSeries, axis=1, result_type='expand').reset_index()

我喜欢在列表理解中使用f-string。。f字符串格式需要Python 3.6+

df_out = df.unstack()['VALUE1']
df_out.columns = [f'{i}{j}' for i, j in df_out.columns]
df_out
输出:

             PRCPsum  SNOWsum    PRCPmean  SNOWmean
US10adam034    701.0      NaN  100.142857       NaN
US10adam036   1015.0     46.0  145.000000      46.0
             PRCPsum  SNOWsum    PRCPmean  SNOWmean
US10adam034    701.0      NaN  100.142857       NaN
US10adam036   1015.0     46.0  145.000000      46.0

我喜欢在列表理解中使用f-string。。f字符串格式需要Python 3.6+

df_out = df.unstack()['VALUE1']
df_out.columns = [f'{i}{j}' for i, j in df_out.columns]
df_out
输出:

             PRCPsum  SNOWsum    PRCPmean  SNOWmean
US10adam034    701.0      NaN  100.142857       NaN
US10adam036   1015.0     46.0  145.000000      46.0
             PRCPsum  SNOWsum    PRCPmean  SNOWmean
US10adam034    701.0      NaN  100.142857       NaN
US10adam036   1015.0     46.0  145.000000      46.0
我认为您可以尝试将最内层的行索引移动为最内层的列索引,以重塑您的数据

您还可以使用fill_值将NaNs更改为0,我想您可以尝试使用将最内层的行索引移动为最内层的列索引,以重塑数据


您还可以使用fill_值将NaNs更改为0

我喜欢这个简单的一行!但是,与使用unstack和列表理解的其他解决方案相比,它的速度非常慢。人们可能只想在小数据集上使用reset_索引。我喜欢这个简单的一行程序!但是,与使用unstack和列表理解的其他解决方案相比,它的速度非常慢。人们可能只想在小数据集上使用reset_索引。谢谢Scott!非常快的解决方案。在~52毫秒内处理了~65K行。谢谢Scott!非常快的解决方案。在约52毫秒内处理了约65K行。