组 ID 基于另一列的条件

我有以下数据框:


Hotel_id    Month_Year      Chef_Id  Chef_is_masterchef  

2400614     May-2015        2297544     0           

2400614     June-2015       2297544     0            

2400614     July-2015       2297544     0               

2400614     August-2015     2297544     0               

2400614     September-2015  2297544     0               

2400614     October-2015    2297544     0               

2400614     November-2015   2297544     0           

2400614     December-2015   2297544     0          

2400614     January-2016    2297544     1        

2400614     February-2016   2297544     1           

2400614     March-2016      2297544     1         


3400624     May-2016        2597531     0           

3400624     June-2016       2597531     0         

3400624     July-2016       2597531     0          

340624     August-2016     2597531     1           

3400624     September-2016  2597531     1           


2400133     February-2016   4597531     0           

2400133     March-2016      4597531     0               

2400133     April-2016      4597531     0         

2400133     May-2016        4597531     0               

2400133     June-2016       4597531     0           

2400133     July-2016       4597531     0           

2400133     August-2016     4597531     1           

2400133     September-2016  4597531     1               

2400133     October-2016    4597531     1               

2400133     November-2016   4597531     1               

2400133     December-2016   4597531     1               

2400133     January-2017    4597531     1           

2400133     February-2017   4597531     1               

2400133     March-2017      4597531     1           

2400133     April-2017      4597531     1         

2400133     May-2017        4597531     1       

我应该捕获 Hotel_id,其中 Chef_is_masterchef 列中每个 id 的最少数量应为 3 个 0 和 1,并忽略其他不满足条件的 Hotel_id。

所以在上面的数据框中,有一个id被删除了。

另外,我必须重复相同的过程来获取另一个数据帧,其中每个 Hotel_id 在 Chef_is_masterchef 列中应具有至少六个 0 和 1 的计数,并忽略其他不满足条件的 Hotel_id。

请让我知道解决方案。


汪汪一只猫
浏览 134回答 1
1回答

慕雪6442864

解决方案如果仅0且1列中的值Chef_is_masterchef:首先对每个组的值进行计数,crosstab并过滤两列是否具有更多或相等的值 by N,DataFrame.ge然后DataFrame.all将与这两个条件匹配的索引值传递给Series.isin:N = 3s = pd.crosstab(df['Hotel_id'], df['Chef_is_masterchef']).ge(N).all(1) df1 = df[df['Hotel_id'].isin(s.index[s])]或者,您可以为调用的测试0值创建新列,并与每组的计数和值一起zeros使用,输出将传递到:GroupBy.transformsum01maskboolean indexingN = 3 mask = (df.assign(zeros=df['Chef_is_masterchef'].eq(0))           .groupby('Hotel_id')[['Chef_is_masterchef', 'zeros']]           .transform('sum')           .ge(N)           .all(axis=1)) df1 = df[mask]print (df1)    Hotel_id      Month_Year  Chef_Id  Chef_is_masterchef0    2400614        May-2015  2297544                   01    2400614       June-2015  2297544                   02    2400614       July-2015  2297544                   03    2400614     August-2015  2297544                   04    2400614  September-2015  2297544                   05    2400614    October-2015  2297544                   06    2400614   November-2015  2297544                   07    2400614   December-2015  2297544                   08    2400614    January-2016  2297544                   19    2400614   February-2016  2297544                   110   2400614      March-2016  2297544                   116   2400133   February-2016  4597531                   017   2400133      March-2016  4597531                   018   2400133      April-2016  4597531                   019   2400133        May-2016  4597531                   020   2400133       June-2016  4597531                   021   2400133       July-2016  4597531                   022   2400133     August-2016  4597531                   123   2400133  September-2016  4597531                   124   2400133    October-2016  4597531                   125   2400133   November-2016  4597531                   126   2400133   December-2016  4597531                   127   2400133    January-2017  4597531                   128   2400133   February-2017  4597531                   129   2400133      March-2017  4597531                   130   2400133      April-2017  4597531                   131   2400133        May-2017  4597531                   1N = 6mask = (df.assign(zeros=df['Chef_is_masterchef'].eq(0))          .groupby('Hotel_id')[['Chef_is_masterchef', 'zeros']]          .transform('sum')          .ge(N)          .all(axis=1))df2 = df[mask]print (df2)    Hotel_id      Month_Year  Chef_Id  Chef_is_masterchef16   2400133   February-2016  4597531                   017   2400133      March-2016  4597531                   018   2400133      April-2016  4597531                   019   2400133        May-2016  4597531                   020   2400133       June-2016  4597531                   021   2400133       July-2016  4597531                   022   2400133     August-2016  4597531                   123   2400133  September-2016  4597531                   124   2400133    October-2016  4597531                   125   2400133   November-2016  4597531                   126   2400133   December-2016  4597531                   127   2400133    January-2017  4597531                   128   2400133   February-2017  4597531                   129   2400133      March-2017  4597531                   130   2400133      April-2017  4597531                   131   2400133        May-2017  4597531                   1如果可能的话,可以使用其他一些值,例如0和:1N = 3mask = (df.assign(zeros= df['Chef_is_masterchef'].eq(0),                  ones = df['Chef_is_masterchef'].eq(1))          .groupby('Hotel_id')[['ones', 'zeros']]          .transform('sum')          .ge(N)          .all(axis=1))df1 = df[mask]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python