我对分组“其他”的语法有疑问。例如,

df

Type  Start  End Count Total
A     x      a   1     3
A     x      b   1     3
A     x      c   1     3
A     y      A   2     4
A     y      b   1     4
A     y      c   1     4
B     x      A   1     6
B     x      b   2     6
B     x      c   3     6
B     y      a   3     6
B     y      b   2     6
B     y      c   1     6


按类型/开始/结束列分组,如果结束不包含“ a”或“ A”,则将其标记为“其他”

Type  Start  End   Count Total
A     x      a     1     3
A     x      other 2     3
A     y      A     2     4
A     y      other 2     4
B     x      A     1     6
B     x      other 5     6
B     y      a     3     6
B     y      other 3     6

最佳答案

你快到了groupby的前两个参数很好,但最后一个需要修改。

f = {'Count': 'sum', 'Total' : 'mean'}
v = df.End.where(df.End.isin(['a', 'A']), 'other')

df.groupby(['Type', 'Start', v]).agg(f).reset_index()

  Type Start    End  Total  Count
0    A     x      a      3      1
1    A     x  other      3      2
2    A     y      A      4      2
3    A     y  other      4      2
4    B     x      A      6      1
5    B     x  other      6      5
6    B     y      a      6      3
7    B     y  other      6      3




细节

使用where / mask相应地更改df.End的值;

v = df.End.where(df.End.isin(['a', 'A']), 'other')


要么,

v = df.End.mask(~df.End.isin(['a', 'A']), 'other')




v

0         a
1     other
2     other
3         A
4     other
5     other
6         A
7     other
8     other
9         a
10    other
11    other
Name: End, dtype: object


或者,将列小写并进行比较。

v = df.End.where(df.End.str.lower().eq('a'), 'other')


其余的,正如他们所说,是历史。如果您对保留列顺序感兴趣,请在最后调用reindex

df.groupby(['Type', 'Start', v])\
  .agg(f)\
  .reset_index()\
  .reindex(columns=df.columns.tolist())

  Type Start    End  Count  Total
0    A     x      a      1      3
1    A     x  other      2      3
2    A     y      A      2      4
3    A     y  other      2      4
4    B     x      A      1      6
5    B     x  other      5      6
6    B     y      a      3      6
7    B     y  other      3      6

关于python - Pandas 团聚给他人,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48289610/

10-09 16:45