【问题标题】:Getting value counts from dataframe based on conditions根据条件从数据框中获取值计数
【发布时间】:2020-07-03 13:27:03
【问题描述】:

我有以下数据框。这里Name代表徽章的名称,Class代表徽章(1=Gold, 2=Silver, 3=Bronze)的等级。我想获得以下三类用户:

  1. 拥有金牌的用户(可能有也可能没有银牌和铜牌)
  2. 有银牌但没有金牌的用户(可能有也可能没有铜牌)
  3. 用户只有铜牌,没有银牌或金牌。

我已经编写了代码,但我认为它不正确。请给我一个方法来做到这一点。

数据帧

   Id | UserId |  Name          |        Date              |Class | TagBased
   2  | 23     | Autobiographer | 2016-01-12T18:44:49.267  |   3  | False
   3  | 22     | Autobiographer | 2016-01-12T18:44:49.267  |   3  | False
   4  | 21     | Autobiographer | 2016-01-12T18:44:49.267  |   3  | False
   5  | 20     | Autobiographer | 2016-01-12T18:44:49.267  |   3  | False
   6  | 19     | Autobiographer | 2016-01-12T18:44:49.267  |   3  | False

代码

df_gold_users = badges[(badges['Class'] == '1')]
df_silver_users = badges[(badges['Class'] != '1') & (badges['Class'] != '3')]
df_bronze_users = badges[(badges['Class'] != '1') & (badges['Class'] != '2')]

gold_users = df_gold_users['UserId'].value_counts().index
silver_users = df_silver_users['UserId'].value_counts().index
bronze_users = df_bronze_users['UserId'].value_counts().index

【问题讨论】:

  • 你为什么不认为它是正确的?
  • 因为 UserId 列没有唯一的用户值,所以值会根据获得的徽章数量重复。在第二行代码中,我提到不包括第 1 类用户,而是选择第 2 类用户,但可能会发生用户对第 1 类和第 2 类通用的情况。因此,即使我选择第 2 类用户我会自动选择 1 类用户。
  • 你不能添加这是第二行吗:(badges['Class'] != '1') & (badges['Class'] == '2') - 用户不是金牌,而是银牌。
  • 可以,非常感谢。我还应该在第二行代码中包含 (badges['Class'] !='3') 吗?

标签: python python-3.x pandas dataframe pandas-groupby


【解决方案1】:

试试这个:

将条件定义为元组:

gold_only=(1,)
gold_and_silver=(1,2)
gold_silver_bronze=(1,2,3)
gold_and_bronze=(1,3)
silver_only=(2,)
silver_and_bronze=(2,3)
bronze_only=(3,)

使用groupbytuple

   df_grouped=df.groupby('Userid')['Class'].unique().apply(lambda x: tuple(sorted(x))).reset_index()

执行测试:

df_grouped['Gold_users']=(df_grouped['Class']==(gold_only))|(df_grouped['Class']==(gold_and_silver))|(df_grouped['Class']==(gold_silver_bronze))|(df_grouped['Class']==(gold_and_bronze))
df_grouped['Silver_users']=(df_grouped['Class']==(silver_only))|(df_grouped['Class']==(silver_and_bronze))
df_grouped['Bronze_users']=(df_grouped['Class']==(bronze_only))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 2021-11-29
    • 2014-12-17
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多