python - 删除每组中最后一个子组对应的行
问题描述
假设我有以下 DataFrame
import numpy as np
import pandas as pd
df = pd.DataFrame(['eggs', np.nan, 'ham', 'eggs', 'spam', 'spam',
'eggs', 'spam', np.nan], columns=['ingredients'])
df['customer'] = (['Badger']*3 + ['Shopkeeper']*3 + ['Pepperpots']*2
+ [np.nan])
df['ordered'] = [1, 1, 0, 0, 1, 0, 1, 0, np.nan]
df.sort_values(['customer', 'ingredients'], inplace=True)
看起来像这样:
ingredients customer ordered
0 eggs Badger 1.0
2 ham Badger 0.0
1 NaN Badger 1.0
6 eggs Pepperpots 1.0
7 spam Pepperpots 0.0
3 eggs Shopkeeper 0.0
4 spam Shopkeeper 1.0
5 spam Shopkeeper 0.0
8 NaN NaN NaN
对于每个客户,我想删除与最后一种成分相对应的行(按字母顺序)。
因此,例如,应删除索引为 4 和 5 的行,因为它们对应于 Shopkeeper 的最后一个成分。
同样,应该删除第 7 行,因为它对应于 Pepperpots 的最后一种成分。
NaN
值应该被忽略。
解决方案
您可以创建一个由分组“最后”成分组成的系列,然后将它们过滤掉。请注意,为此目的,NaN
不会去除成分。
s = df.sort_values('ingredients')\
.groupby('customer')['ingredients']\
.transform('last').sort_index()
df = df[df['ingredients'] != s]
print(df)
ingredients customer ordered
0 eggs Badger 1.0
1 NaN Badger 1.0
3 eggs Shopkeeper 0.0
6 eggs Pepperpots 1.0
8 NaN NaN NaN
使用此解决方案,您可以省略df.sort_values(['customer', 'ingredients'], inplace=True)
, 因为上面实现的GroupBy
+transform
按索引对齐。
推荐阅读
- kotlin - 如何在 Kotlin 中逐项比较两个列表
- javascript - Nodemon 命令不起作用 未经授权的访问
- flutter - 列布局中的底部小部件溢出?
- html - 单击时将复选框的值保存在数组中(jQuery)
- python - 如何在不返回并更改数据的情况下更改 seaborn 小提琴图的 x 轴标签?
- javascript - (节点:2824)UnhandledPromiseRejectionWarning:ReferenceError:角色未定义
- excel - 将文本框值插入公式
- javascript - javascript (PacMan) 的键码移动问题
- python - 为什么将 NumPy FFT 的输出除以 N?
- android - 如何解决构建错误 - 包模块可能未定义 LOCAL_MODULE_SUFFIX