Python 在中的聚合中应用筛选器
假设我有以下Python 在中的聚合中应用筛选器,python,pandas,aggregation,Python,Pandas,Aggregation,假设我有以下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
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({“字母”:lambda w:list(w)})
将产生:
letter
number
1 [alpha, beta, gamma]
2 [alpha]
但是我只想包括列,这样相应的q
值就不是NaN
,即
number letter
0 1 [beta]
1 2 [alpha]
Edit:我希望有一个更通用的解决方案(不仅仅是如果我们有NaN
值),而是如果我们想将q
的值指定为包含或不包含的阈值 我认为需要:
如果要指定列以删除缺少的值:
df1 = df.dropna(subset=['q']).groupby('number').agg({"letter": lambda w: list(w)})
print (df1)
letter
number
1 [beta]
2 [alpha]
编辑:
您还可以通过以下方式进行筛选:
或:
编辑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]
谢谢你的回答,但我需要更一般的东西。例如,如果
q
的值大于指定的数字。太好了,谢谢!
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)})
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]