【发布时间】:2018-02-28 22:25:16
【问题描述】:
这是我正在练习的数据
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv")
我想按分组值过滤单个行。我知道我可以执行以下操作来过滤组
df.groupby("day").filter(lambda x: x['total_bill'].mean() > 20).day.unique()
找出哪些天的平均账单大于 20 美元。这是有效的,因为 groupby.filter 需要一个函数来应用于每个应该返回 True 或 False 的子帧。但是,如果我想找到 total_bill 的值大于当天的 total_bill 的每一餐(行)怎么办。例如,如果一行有 total_bill 和 22 并且是在星期日,那么应该保留它,因为星期日的 total_bill 平均值是 21.41。
这是我的尝试:
df.groupby('day').apply(lambda x: x['total_bill'] > x['total_bill'].mean())
但是,这会产生如下所示的内容(前几行)
day
Fri 90 True
91 True
92 False
93 False
94 True
Name: total_bill, dtype: bool
这与数据框的顺序不同,所以我不能只取布尔列并使用它来索引数据。
所以现在我执行以下操作:
grouped = (df
.groupby('day')
.apply(lambda x: x['total_bill'] > x['total_bill'].mean())
.reset_index())
index_bill = (grouped
.loc[grouped.total_bill == True, 'level_1'].values)
df.loc[index_bill]
这给了我想要的结果......必须有一个更简单的方法,对吧?请让我知道是否有适当的方法来做到这一点。如果没有,至少有一种方法可以将这两个步骤合二为一吗?我可以进行 groupby,但不确定如何在不将分组对象存储为变量然后引用它的情况下获取值。谢谢!
【问题讨论】:
标签: python pandas pandas-groupby