我对分组“其他”的语法有疑问。例如,
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
