这是一个涉及旋转和分组数据的数据转换问题。我看了一大堆关于这个话题的SE posts,我几乎做到了,但还不完全是。因此,任何帮助都是非常感谢的。
我的数据看起来像这样。
所以你可以看到经典的数据库格式,其中有一口井和一些井ID号,然后有不同的化学品测量在不同的日期。因此,一个简单的透视表只会创建新的列,每个日期都是它自己的列。然而,观察是在不同的日期捕获的,所以我最终会得到大约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()
操作结合起来?我就在最后一步,所以任何帮助都是非常感谢的。
发布于 2019-06-24 09:00:48
只需添加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)
https://stackoverflow.com/questions/56728581
复制相似问题