这是一个数据转换问题,涉及到数据透视和分组。我看了一堆与此主题有关的SE posts,并且差不多在那儿了,但还不是很清楚。因此,任何帮助表示赞赏。
我有看起来像这样的数据。
因此,您可以看到经典的数据库格式,其中有一口井带有一些WELL ID号,然后在不同的日期进行了不同的CHEMICALS测量。因此,一个简单的方法就是创建一个新的列,并将每个日期作为自己的列。但是,观察值是在不同的日期捕获的,所以最终我会得到大约100列。相反,我想创建那些枢轴的列,然后平均一年的值。
目标:
因此,我希望结果看起来如下所示。对于每个Chemical-Year
组合,每口井都应有一个单独的列,其余的列(如纬度和经度)应保留在最终数据中。
Well Id TCPR123_2019 TCPC123_2018 TBR123_2019 Latitude Longitude ...
0103041-001 0.0 0.25 0.0 37.72... -122.157...
0105003-001 0.0 0.5 0.3 37.66... -121.84...
我做了什么这么快:
因此,我做了一些转换并使用了代码:
df.groupby(['WELL ID','CHEMICAL',
pd.Grouper(freq='Y', key='DATE', closed='left')])['RESULTS'].mean()
结果是这样。
WELL ID CHEMICAL DATE RESULTS
0103041-001 AS 2011-12-31 4.300000
2015-12-31 2.300000
2019-12-31 0.000000
0105003-001 AS 2011-12-31 0.000000
2014-12-31 0.000000
我只需要对此进行透视,并显示其余的列。我必须使用['RESULTS'].mean()
,因为否则它将平均所有列。我尝试使用df.unstack()
,但其中不包括其他剩余的列。但是我不确定如何将pandas.DataFrame.pivot()
与df.groupby()
操作结合起来?我在最后一步是正确的,因此我们将为您提供任何帮助。
答案 0 :(得分:1)
只需添加unstack
df['year']=df.DATE.dt.year
s=df.groupby(['WELL ID','CHEMICAL', 'year'])['RESULTS'].mean().unstack([1,2])
s.columns=s.columns.map('{0[0]}_{0[1]}'.format)