简体   繁体   English

Pandas 基于 groupby 掩码过滤数据帧的最有效方法

[英]Pandas most efficient way to filter dataframe based on groupby mask

I would like to filter a dataframe based on the values in that df's groupby results on a column.我想根据列上 df 的groupby结果中的值过滤数据框。 For example, if I have a dataframe with columns := ticker, year, price , I'd like to filter out of the df tickers whose first year is >= 1990.例如,如果我有一个包含columns := ticker, year, price的数据框,我想过滤掉第一年 >= 1990 的 df 代码。

or more technically where the ticker evaluates to True in df.groupby('ticker').['year'].min() < 1990或者从技术上讲,代码在df.groupby('ticker').['year'].min() < 1990中评估为 True

I am currently doing it this way:我目前正在这样做:

ticker_min_date_bool = df.groupby('ticker')['year'].min() < 1990 # get booleans
tickers_filt = [i for i in ticker_min_date_bool.index if ticker_min_date_bool[i]] # make list of tickers with criteria
df_new = df[df.ticker.isin(tickers_filt)] # filter df based on above list

However this feels a little clumsy to do in 3 lines and doesn't seem to scale well for larger datasets.然而,这在 3 行中做起来感觉有点笨拙,而且似乎不能很好地扩展到更大的数据集。

Are there any dataframe methods that accomplish this more efficiently?是否有任何数据框方法可以更有效地完成此任务?

Just do transform只做transform

ticker_min_date_bool = df.groupby('ticker')['year'].transform('min') < 1990
df_new = df[ticker_min_date_bool]

Or without groupby或者没有groupby

s = df.loc[df['year']<1990,'ticker']
df_new = df[df['ticker'].isin(s)]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM