我有以下问题。
mtx =[['0','q'],
['0','e'],
['1','q'],
['1','w'],
['2','r'],
['2','e'],
['2','w'],
['3','t'],
['4','y']]
df10 = pd.DataFrame(np.insert(mtx, 2, np.random.rand(len(mtx))*10, axis=1),
columns=['id','cat','val'])
我想
- 是否由 ID 和 CAT 进行分组
- 所有 cat 在每个 id 的结果中都存在
- 在 val ,
- 缺席(ID,CAT)组合填充0s。
即。结果将具有以下形式。
mtx1 = [[el1, el] for el in 'qwerty' for el1 in '01234']
df11 = pd.DataFrame(np.insert(mtx1, 2, '-', axis=1),
columns=['id','cat','val'])
>>>
[['0' 'q' '-']
['1' 'q' '-']
['2' 'q' '-']
['3' 'q' '-']
['4' 'q' '-']
['0' 'w' '-']
['1' 'w' '-']
['2' 'w' '-']
['3' 'w' '-']
['4' 'w' '-']
['0' 'e' '-']
['1' 'e' '-']
['2' 'e' '-']
['3' 'e' '-']
['4' 'e' '-']
['0' 'r' '-']
['1' 'r' '-']
['2' 'r' '-']
['3' 'r' '-']
['4' 'r' '-']
['0' 't' '-']
['1' 't' '-']
['2' 't' '-']
['3' 't' '-']
['4' 't' '-']
['0' 'y' '-']
['1' 'y' '-']
['2' 'y' '-']
['3' 'y' '-']
['4' 'y' '-']]
对于-
,应该有func
或0s的结果。可以在熊猫中惯用这种操作吗?使用.groupby
?我只能想到手动创建跨产品,然后检查原始df10
如果存在组合,然后在原始df
中存在组合后应用func
或插入0
。
MultiIndex
Series
的第一个汇总sum
,通过MultiIndex.from_product
创建所有可能的组合,使用Series.reindex
用于添加由0
填充的添加缺失值,如有必要,Series.sort_index
和最后的Series.reset_index
:
np.random.seed(2019)
mtx =[['0','q'],
['0','e'],
['1','q'],
['1','w'],
['2','r'],
['2','e'],
['2','w'],
['3','t'],
['4','y']]
df10 = pd.DataFrame(np.insert(mtx, 2, np.random.rand(len(mtx))*10, axis=1),
columns=['id','cat','val'])
print (df10)
id cat val
0 0 q 9
1 0 e 3
2 1 q 6
3 1 w 6
4 2 r 8
5 2 e 2
6 2 w 7
7 3 t 9
8 4 y 8
s = df10.groupby(['id','cat'])['val'].sum()
mux = pd.MultiIndex.from_product(s.index.levels, names=s.index.names)
df = s.reindex(mux, fill_value=0).sort_index(level=[1,0]).reset_index()
print (df.head(10))
id cat val
0 0 e 3
1 1 e 0
2 2 e 2
3 3 e 0
4 4 e 0
5 0 q 9
6 1 q 6
7 2 q 0
8 3 q 0
9 4 q 0
以下是可以帮助您带来欲望结果
的代码mtx =[['0','q'],
['0','e'],
['1','q'],
['1','w'],
['2','r'],
['2','e'],
['2','w'],
['3','t'],
['4','y']]
df10 = pd.DataFrame(np.insert(mtx, 2, np.random.rand(len(mtx))*10, axis=1),
columns=['id','cat','val'])
df10.pivot_table(index=['cat'], columns=['id'],values='val',aggfunc=np.sum).fillna(0).stack(['id']).sort_index(level=1).reset_index()
df10.rename(columns={'cat':'cat','id':'id',0:'val'}, inplace=True)
df10
如果您只希望以组合格式使用此数据,则仅使用以下代码
df10.pivot_table(index=['cat'], columns=['id'],values='val',aggfunc=np.sum).fillna(0)