Python 如何展平数据帧GroupBy
我有一个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} 打印出磁头会产生以下结果: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,
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行。