分组所有类别,在功能上汇总并填充PANDAS中的NAS



我有以下问题。

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'])

我想

  1. 是否由 ID CAT 进行分组
  2. 所有 cat 在每个 id 的结果中都存在
  3. val
  4. 缺席(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)

最新更新