为了账号安全,请及时绑定邮箱和手机立即绑定

组 ID 基于另一列的条件

组 ID 基于另一列的条件

汪汪一只猫 2023-07-11 15:09:57
我有以下数据框: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。请让我知道解决方案。
查看完整描述

1 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

解决方案如果仅01列中的值Chef_is_masterchef

首先对每个组的值进行计数,crosstab并过滤两列是否具有更多或相等的值 by NDataFrame.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 indexing

N = 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_masterchef

0    2400614        May-2015  2297544                   0

1    2400614       June-2015  2297544                   0

2    2400614       July-2015  2297544                   0

3    2400614     August-2015  2297544                   0

4    2400614  September-2015  2297544                   0

5    2400614    October-2015  2297544                   0

6    2400614   November-2015  2297544                   0

7    2400614   December-2015  2297544                   0

8    2400614    January-2016  2297544                   1

9    2400614   February-2016  2297544                   1

10   2400614      March-2016  2297544                   1

16   2400133   February-2016  4597531                   0

17   2400133      March-2016  4597531                   0

18   2400133      April-2016  4597531                   0

19   2400133        May-2016  4597531                   0

20   2400133       June-2016  4597531                   0

21   2400133       July-2016  4597531                   0

22   2400133     August-2016  4597531                   1

23   2400133  September-2016  4597531                   1

24   2400133    October-2016  4597531                   1

25   2400133   November-2016  4597531                   1

26   2400133   December-2016  4597531                   1

27   2400133    January-2017  4597531                   1

28   2400133   February-2017  4597531                   1

29   2400133      March-2017  4597531                   1

30   2400133      April-2017  4597531                   1

31   2400133        May-2017  4597531                   1

N = 6

mask = (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_masterchef

16   2400133   February-2016  4597531                   0

17   2400133      March-2016  4597531                   0

18   2400133      April-2016  4597531                   0

19   2400133        May-2016  4597531                   0

20   2400133       June-2016  4597531                   0

21   2400133       July-2016  4597531                   0

22   2400133     August-2016  4597531                   1

23   2400133  September-2016  4597531                   1

24   2400133    October-2016  4597531                   1

25   2400133   November-2016  4597531                   1

26   2400133   December-2016  4597531                   1

27   2400133    January-2017  4597531                   1

28   2400133   February-2017  4597531                   1

29   2400133      March-2017  4597531                   1

30   2400133      April-2017  4597531                   1

31   2400133        May-2017  4597531                   1

如果可能的话,可以使用其他一些值,例如0和:1


N = 3

mask = (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]


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信