如果我将从长格式转换为分组聚合格式,我只会这样做:
s = pd.DataFrame(['a','a','a','a','b','b','c'], columns=['value'])
s.groupby('value').size()
value
a 4
b 2
c 1
dtype: int64
现在,如果我想恢复该聚合并从分组格式转换为长格式,我将如何进行此操作?我想我可以遍历分组的系列并重复一次' a' 4次和' b' 2次等。
在pandas或任何其他Python包中有更好的方法吗?
感谢任何提示
答案 0 :(得分:2)
也许.transform
可以帮助解决这个问题:
s.set_index('value', drop=False, inplace=True)
s['size'] = s.groupby(level='value', as_index=False).transform(size)
s.reset_index(inplace=True, drop=True)
s
得到以下特性:
value size
0 a 4
1 a 4
2 a 4
3 a 4
4 b 2
5 b 2
6 c 1
答案 1 :(得分:1)
另一种相当简单的方法是使用np.repeat
(假设s2
是聚合系列):
In [17]: np.repeat(s2.index.values, s2.values)
Out[17]: array(['a', 'a', 'a', 'a', 'b', 'b', 'c'], dtype=object)
In [18]: pd.DataFrame(np.repeat(s2.index.values, s2.values), columns=['value'])
Out[18]:
value
0 a
1 a
2 a
3 a
4 b
5 b
6 c
答案 2 :(得分:0)
可能会有更清洁的东西,但这是一种方法。首先,将结果存储在数据帧中并重命名columsn。
agg = s.groupby('value').size().reset_index()
agg.columns = ['key', 'count']
然后,构建一个框架,其中包含跟踪每个字母的计数的列。
counts = agg['count'].apply(lambda x: pd.Series([0] * x))
counts['key'] = agg['key']
In [107]: counts
Out[107]:
0 1 2 3 key
0 0 0 0 0 a
1 0 0 NaN NaN b
2 0 NaN NaN NaN c
最后,这可以融化并使空值降低以获得所需的帧。
In [108]: pd.melt(counts, id_vars='key').dropna()[['key']]
Out[108]:
key
0 a
1 b
2 c
3 a
4 b
6 a
9 a