python - 删除每组中最后一个子组对应的行

标签 python pandas dataframe grouping pandas-groupby

假设我有以下 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 如上面实现的那样,按索引对齐。

关于python - 删除每组中最后一个子组对应的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51984993/

相关文章:

python - 尽管调用单个索引,Pandas .loc[] 方法仅返回 DataType 而不是 Series

string - 如何永久禁用 data.frame 中的 stringsAsFactors=TRUE ?

python - Pandas DataFrame - 根据其他列的值填充列的 NaN

python - 使用GPXPY解析gpx文件导致not well-formed invalid token错误

python - 在 python 中过滤具有特定列名的 Pandas 数据框

python - 二进制数据转换缓慢

python - GAN 生成完全相同的图像跨批处理只是因为种子分布,为什么?

python - Pandas:如何删除系列中的非字母数字列

python - 本地化并更改 pandas 数据框中的日期

python - 数据作为数据帧附加在内存中