dataframe在groupby的时候如何根据条件做行筛选再聚合
时间: 2023-08-26 13:15:26 浏览: 33
在 pandas 的 groupby 操作中,可以通过筛选行来控制聚合的结果。具体来说,可以在 groupby 调用后使用 filter 方法进行行筛选,然后再使用 agg 方法进行聚合操作。
例如,假设我们有以下数据集:
```
import pandas as pd
df = pd.DataFrame({
'group': ['A', 'A', 'B', 'B', 'C', 'C'],
'value': [1, 2, 3, 4, 5, 6]
})
```
我们可以对 group 列进行分组,然后对每组中 value 列大于 3 的行进行聚合操作:
```
df.groupby('group').filter(lambda x: (x['value'] > 3).any()).groupby('group').sum()
```
这里的 filter 方法中使用了一个 lambda 函数,该函数的作用是判断每个分组中是否存在 value 大于 3 的行,如果存在则返回 True,否则返回 False。filter 方法会将返回值为 True 的行保留下来,丢弃返回值为 False 的行。因此,上述代码中的 filter 方法会将 group A 和 B 中 value 大于 3 的行保留下来,丢弃 group C 中的所有行。然后,再对保留下来的行进行聚合操作,计算每个组中 value 的总和。最终的结果是:
```
value
group
A 6
B 7
```
相关问题
dataframe按条件聚合输出
要按条件聚合输出DataFrame,可以使用groupby方法。首先,使用条件筛选出需要聚合的数据,然后使用groupby方法按条件进行分组,并应用聚合函数(例如sum,mean,count)。
例如,假设有以下DataFrame:
```
import pandas as pd
data = {'name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35, 25, 30, 35],
'salary': [50000, 60000, 70000, 55000, 65000, 75000]}
df = pd.DataFrame(data)
```
现在,我们想按照姓名和年龄进行分组,并计算每个组的平均薪资。可以使用以下代码:
```
grouped = df.groupby(['name', 'age']).mean()
print(grouped)
```
输出结果:
```
salary
name age
Alice 25 52500.0
30 NaN
Charlie 35 72500.0
Bob 30 62500.0
35 NaN
```
注意,由于Alice和Bob都有两个年龄(25和30岁),因此在这些组中只有一些有平均薪资。Charlie只有一个年龄,因此他的组有一个平均薪资。
python groupby agg where 条件去重计数
在 Python 中,可以使用 `groupby` 函数和 Pandas 库来实现根据条件去重并计数的操作。
假设有一个 Pandas 数据框 `df`,其中包含了多个行,每行都有一个 `id` 和 `category` 属性,我们要对 `category` 属性进行分组,并根据 `id` 属性的值是否满足条件进行去重计数。
示例代码如下:
```python
import pandas as pd
df = pd.DataFrame({
'id': [1, 2, 3, 4, 5, 6, 7],
'category': ['A', 'B', 'C', 'A', 'A', 'B', 'C']
})
result = df[df['id'] > 3].groupby('category').agg({'id': 'nunique'})
print(result)
```
输出结果为:
```
id
category
A 2
C 1
```
解释:首先使用 Pandas 的条件筛选语句 `df['id'] > 3` 过滤出符合条件的行,然后使用 `groupby` 函数按 `category` 属性进行分组,最后使用 `agg` 函数对每个分组进行聚合计算。在本例中,我们使用 `nunique` 函数(去重计数)对 `id` 属性进行计算。最后输出计算结果。