修复Pandas中的Groupby长度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修复Pandas中的Groupby长度相关的知识,希望对你有一定的参考价值。

我有一个按Pandas数据框分组:

id    date    temperature
1  2011-9-12   12
   2011-9-18   12
   2011-9-19   12
2  2011-9-12   15
3  2011-9-12   15
   2011-9-16   15

这里,每个id具有不同数量的温度记录。

我想修复它们,说出每个id的平均记录数(比如3)。如果缺少某些记录,我想先写入零。

即我的最终数据框应为:

id    temperature
1     12
      12
      12
2     0
      0
      15
3     0
3     15
3     15

我需要将每个id的记录数量自定义为某个数字,这也可能是每个id的平均记录数。如何获得平均值?

答案

我们可以在访问groupby元素时使用reindexrange(3)。在那之后我们sort_values并将NaN设置为第一位置,因此我们可以将fillna设为0。

df_new = pd.concat([
    d[['id', 'temperature']].reset_index(drop=True).reindex(range(3)).sort_values('id', na_position='first')
    for _, d in df.groupby('id')
], ignore_index=True)

df_new['id'].fillna(method='bfill', inplace=True)
df_new['temperature'].fillna(0, inplace=True)

print(df_new)
    id  temperature
0  1.0         12.0
1  1.0         12.0
2  1.0         12.0
3  2.0          0.0
4  2.0          0.0
5  2.0         15.0
6  3.0          0.0
7  3.0         15.0
8  3.0         15.0

请注意,您有iddate作为索引,因此首先运行:

df.reset_index(inplace=True)
另一答案

只需使用stackunstack

df.groupby(level=0)['temperature'].\
      apply(list).\
         apply(pd.Series).iloc[:,:3].\
                 apply(lambda x : pd.Series(sorted(x,key=pd.notnull)),1).\
                   fillna(0).stack().reset_index(level=0)
Out[523]: 
   id     0
0   1  12.0
1   1  12.0
2   1  12.0
0   2   0.0
1   2   0.0
2   2  15.0
0   3   0.0
1   3  15.0
2   3  15.0

Numpy解决方案加快速度

s=df.groupby(level=0)['temperature'].apply(list)
s1=s.tolist()
arr = np.zeros((len(s1),3),int)
lens = [3-len(l) for l in s1]
mask = np.arange(3) >=np.array(lens)[:,None]
arr[mask] = np.concatenate(s1)
pd.DataFrame('id':s.index.repeat(3),'temperature':arr.ravel())

以上是关于修复Pandas中的Groupby长度的主要内容,如果未能解决你的问题,请参考以下文章

如何对不同长度的 Python Pandas groupby 对象进行切片?

不同长度的pandas groupby元组-ValueError:在通过级别中找不到值:MultiIndex

Pandas Groupby Agg 函数不减少

pandas-09 pd.groupby()的用法

在groupby之后访问pandas中的分层列

python pandas中的Groupby:快速方式