【问题标题】:Filter Pandas Dataframe by 2 counts按 2 个计数过滤 Pandas 数据框
【发布时间】:2020-02-28 00:31:04
【问题描述】:

我有以下 pandas 数据框 --

 1. A     John
 2. A     Juliet
 3. A     Joseph
 4. A     Romeo
 5. A     Chris
 6. A     John
 7. A     Juliet
 8. A     Joseph
 9. A     Romeo
 10. A     Chris
 11. A     John
 12. B     Juliet
 13. B     Joseph
 14. B     Romeo
 15. B     Chris
 16. B     John
 17. C     Juliet
 18. C     Joseph
 19. C     Romeo

我必须使用 2 个条件进行过滤:

  1. 其中员工(姓名)各为 3 并且
  2. 其中 A 的计数为 8,B 的计数为 4,C 的计数为 3
My logic filters for each employee being there 3 times --

unique_employee=df.loc[:,"Employee"].unique().tolist()

count=0
for i in unique_employee:
    if count==0:
        df2=df1[df1['Employee']==i].iloc[0:3,:]
        count+=1
    else:
        df2=pd.concat([df2,df1[df1['Employee']==i].iloc[0:3,:]])

How do i put in the second part of my condition too?

我的预期输出将是 A 公司将有 8 个实例,B 公司将有 4 个实例,C 公司将有 3 个实例,并且教员工将在那里三次--

A    John
A    John
B    John
A    Joseph
A    Joseph
C    Joseph
A    Chris
A    Chris
B    Chris
A    Juliet
B    Juliet
C    Juliet
A    Romeo
B    Romeo
C    Romeo

【问题讨论】:

  • 编辑问题以添加更新,请勿在 cmets 中添加。
  • 您对此数据集的预期输出是什么?如果我理解正确,那么只有克里斯?
  • @Datanovice 我已在查询中添加了上面的预期输出。

标签: python pandas csv filter conditional-statements


【解决方案1】:

在下面的代码中,存储“A”、“B”、“C”的列的名称被命名为“abc”。

每个 ep 都是由“员工”列标识的组。使用 counter 将返回一个计数器对象(类似于字典),指示员工有多少 abc。

然后将计数器与condition_dic(预先设置)进行比较。如果满足要求,则将其附加到输出列表中。

from collections import Counter
employees=df.groupby("Employee")
condition_dic = {'A': 8, 'B':4, 'C':3}

output = []
for ep in employees:
    if len(ep[1]) == 3:
        output.append(ep[1])
    else:
        cnt = Counter(ep[1]['abc'])
        if cnt == condition_dic:
            output.append(ep[1])

output = pd.concat(output)

【讨论】:

  • else: cnt = Counter(ep[1]['abc']) if cnt == condition_dic: output.append(ep[1]) 如何从第 1 列读取值(公司A、B 公司和 C 公司)?我不需要以某种方式引用该列吗?
  • 如果它们分别被称为A公司、B公司和C公司,那么这将如何运作?
  • @RahulGeorge 然后,您只需将 condition_dic 中的键替换为您想要的任何值。例如condition_dic = {'公司 A': 8, '公司 B':4, '公司 C':3}
  • 谢谢你的解释,但我猜你没有理解我的问题。如果是“A公司”等等等等,这将如何变化? else: cnt = Counter(ep[1]['abc']) if cnt == condition_dic: output.append(ep[1])
  • @RahulGeorge 我看到了你对这个问题的更新。在这种情况下,您可能希望首先过滤掉所有记录超过 3 条的员工。然后使用搜索算法找出位置组合。 Leetcode 可能是寻找此类算法的更合适的空间。
猜你喜欢
  • 2019-03-25
  • 2016-01-21
  • 2018-09-29
  • 1970-01-01
  • 2023-02-16
  • 2018-06-07
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
相关资源
最近更新 更多