按所有类别分组,在一个函数上进行聚合,并在表中填写生成的NAs

2024-05-19 09:47:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下问题。你知道吗

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. idcat分组
  2. 在每个id的结果中都有所有可能的猫
  3. val应用func(例如,sum
  4. 对于不存在的(id,cat)组合填写0

也就是说,结果的形式如下。你知道吗

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或0的结果。 有没有可能在熊猫身上进行这种惯用的操作?用.groupby?我只能考虑手动创建交叉积,然后检查原始的df10(如果存在组合),然后在原始的df中存在组合时应用func或插入0。你知道吗


Tags: columnsiddataframenpvalelcatpd
2条回答

首先聚合sum对于MultiIndexSeries,通过^{}创建所有可能的组合,使用^{}添加由0填充的缺失值,如果需要^{}和最后一个^{}

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)

相关问题 更多 >

    热门问题