Skip to main content
 首页 » 编程设计

python之Pandas 群给他人

2025年05月04日14JustinYoung

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

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 

按 Type/Start/End 列分组,如果 End 不包含“a”或“A”则将它们标记为“other”

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