python - 在 pandas 的聚合中应用过滤器
问题描述
假设我有以下内容pd.DataFrame
。
import pandas as pd
import numpy as np
data = {'number': [1, 1, 1, 2], 'q':[np.nan, 2, np.nan, 1], 'letter': ['alpha', 'beta', 'gamma', 'alpha']}
df = pd.DataFrame(data)
number q letter
0 1 NaN alpha
1 1 2.0 beta
2 1 NaN gamma
3 2 1.0 alpha
我想要做的是按数字聚合并创建一个包含所有字母的列表,并根据q
.
如果我这样做:
df.groupby('number').agg({"letter": lambda w: list(w) })
将产生:
letter
number
1 [alpha, beta, gamma]
2 [alpha]
但我只想包含相应q
值不是的列NaN
,即
number letter
0 1 [beta]
1 2 [alpha]
编辑:我希望有一个更通用的解决方案(不仅仅是如果我们有NaN
值),但如果我们想将值指定q
为将要包含或不包含的阈值。
解决方案
我认为需要DataFrame.dropna
:
df1 = df.dropna().groupby('number').agg({"letter": lambda w: list(w)})
如果要指定删除缺失值的列:
df1 = df.dropna(subset=['q']).groupby('number').agg({"letter": lambda w: list(w)})
print (df1)
letter
number
1 [beta]
2 [alpha]
编辑:
您还可以通过以下方式过滤query
:
df1 = df.query("q > 0").groupby('number').agg({"letter": lambda w: list(w)})
df1 = df[df['q'] > 0].groupby('number').agg({"letter": lambda w: list(w)})
df1 = df[df['q'].notnull()].groupby('number').agg({"letter": lambda w: list(w)})
编辑1:
过滤也可以在功能上,以避免丢失不匹配的组:
def f(x):
return x.loc[x['q'] > 1, 'letter'].tolist()
df2 = df.groupby('number').apply(f).reset_index(name='val')
print (df2)
number val
0 1 [beta]
1 2 []
df1 = df[df['q'] > 1].groupby('number').agg({"letter": lambda w: list(w)})
print (df1)
letter
number
1 [beta]
推荐阅读
- azure-table-storage - 使用 Blob 和表创建存储帐户的 ARM 模板
- http - 上下文没有超时
- java - 当我从文本文件中读取时得到问号
- python - 您如何以具有不同头像图像和名称的机器人发布?
- macos - Sed + Regex 将匹配除以反引号开头的任何行
- csv - Shopify 产品导入 CSV 验证错误无效文件
- css - 在 CSS-Grid 中调整 gatsby-background-image 中的文本大小调整整个图像的大小
- python - Python 正则表达式 findall 函数仅返回组匹配而不是完整字符串
- bash - 循环 bash 别名并在脚本中运行命令
- c# - 为什么范围索引不适用于动态