修复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元素时使用reindex
和range(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
请注意,您有id
和date
作为索引,因此首先运行:
df.reset_index(inplace=True)
另一答案
只需使用stack
和unstack
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 对象进行切片?