同时旋转和分组列

时间:2019-06-24 00:08:39

标签: python pandas

这是一个数据转换问题,涉及到数据透视和分组。我看了一堆与此主题有关的SE posts,并且差不多在那儿了,但还不是很清楚。因此,任何帮助表示赞赏。

我有看起来像这样的数据。

enter image description here

因此,您可以看到经典的数据库格式,其中有一口井带有一些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()操作结合起来?我在最后一步是正确的,因此我们将为您提供任何帮助。

1 个答案:

答案 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)