代码之家  ›  专栏  ›  技术社区  ›  artemis Roberto

在NaN中将条件COUNTIF应用于pandas数据帧结果

  •  1
  • artemis Roberto  · 技术社区  · 5 年前

    如果这是副本,请把我和副本联系起来。我还没有找到其他的帖子来回答我的问题。

    我有一个数据框, knn_res ,尺寸和数据如下:

                username  Prediction  is_bot
    0         megliebsch           1       0                                                                                1         megliebsch           1       0
    2         megliebsch           1       0
    3         megliebsch           1       0
    4         megliebsch           1       0
    ...              ...         ...     ...
    1220     ARTHCLAUDIA           1       1
    1221     ARTHCLAUDIA           1       1                                                                                1222     ARTHCLAUDIA           1       1
    1223     ARTHCLAUDIA           1       1
    1224  ASSUNCAOWALLAS           1       1
    
    [1225 rows x 3 columns]
    

    我想做的是,对于每个用户名,计算预测的数量 prediction = 1 在哪里 prediction = 0 并用这些值创建两个新列。例如,使用以下数据集:

    | username | prediction | is_bot |
    |:--------:|:----------:|:------:|
    |    foo   |      1     |    1   |
    |    foo   |      1     |    1   |
    |    foo   |      1     |    1   |
    |    foo   |      0     |    1   |
    |    foo   |      0     |    1   |
    |   foo1   |      0     |    1   |
    |   foo1   |      0     |    1   |
    |   foo1   |      0     |    0   |
    |   foo1   |      0     |    0   |
    |   foo1   |      1     |    0   |
    |   foo1   |      1     |    0   |
    |   foo1   |      0     |    0   |
    |   foo2   |      1     |    0   |
    |   foo2   |      1     |    0   |
    |   foo2   |      1     |    1   |
    

    我想要:

    | username | count_bot  | count_human |
    |:--------:|:----------:|:-----------:|
    |    foo   |      3     |      2      |
    |   foo1   |      2     |      5      |
    |   foo2   |      3     |      0      |
    

    当下列逻辑适用时:

    对于每一行,如果 Prediction == 1 ,然后增加 count_bot 计数器。如果 Prediction == 0 ,然后增加 count_human 计数器。然后,附加每行的总计并按分组。

    到目前为止,我试过引用 this question 并尝试了以下操作:

    knn_res['count_bot'] = knn_res[knn_res.Prediction == 1].count()
    print(knn_res)
    

    结果是:

                username  Prediction  is_bot  count_bot
    0         megliebsch           1       0        NaN
    1         megliebsch           1       0        NaN
    2         megliebsch           1       0        NaN
    3         megliebsch           1       0        NaN
    4         megliebsch           1       0        NaN
    ...              ...         ...     ...        ...
    1220     ARTHCLAUDIA           1       1        NaN
    1221     ARTHCLAUDIA           1       1        NaN
    1222     ARTHCLAUDIA           1       1        NaN
    1223     ARTHCLAUDIA           1       1        NaN
    1224  ASSUNCAOWALLAS           1       1        NaN
    

    尝试:

    new = knn_res.groupby('username').sum()
    print(new)
    

    产量:

                     Prediction  is_bot
    username
    666STEVEROGERS           25      25
    ADELE_BROCK               1      25
    ADRIANAMFTTT             24      25
    AHMADRADJAB               1      25
    ALBERTA_HAYNESS          24      25
    ALTMANBELINDA            23      25
    ALVA_MC_GHEE             25      25
    ANGELITHSS               25      25
    ANN1EMCCONNELL           25      25
    ANWARJAMIL22             25      25
    AN_N_GASTON              25      25
    ARONHOLDEN8              25      25
    ARTHCLAUDIA              25      25
    ASSUNCAOWALLAS            1       1
    BECCYWILL                 9      25
    BELOZEROVNIKIT           17      25
    BEN_SAR_GENT              1      25
    BERT_HENLEY              24      25
    BISHOLORINE              25      25
    BLACKERTHEBERR5          11      25
    BLACKTIVISTSUS            7      25
    BLACK_ELEVATION          24      25
    BOGDANOVAO2               7      25
    BREMENBOTE               10      25
    B_stever96                1       0
    CALIFRONIAREP            24      25
    C_dos_94                 25      24
    Cassidygirly             25       0
    ChuckSpeaks_             25       0
    Cyabooty                  0       0
    DurkinSays                1       0
    LSU_studyabroad          24       0
    MisMonWEXP                0       0
    NextLevel_Mel            25       0
    PeterDuca                24       0
    ShellMarcel              25       0
    Sir_Fried_Alott          25       0
    XavierRivera_             0       0
    ZacharyFlair              0       0
    brentvarney44             1       0
    cbars68                   0       0
    chloeschultz11           25       0
    hoang_le_96               1       0
    kdougherty178            25       0
    lasallephilo              0       0
    lovely_cunt_              1       0
    megliebsch               24       0
    msimps_15                24       0
    okweightlossdna          24       0
    tankthe_hank             24       0
    

    为了达到我想要的结果,我做错了什么?

    2 回复  |  直到 5 年前
        1
  •  1
  •   Andy L.    5 年前

    按两者分组 username prediction 分隔列的相同值 用户名 预测 到小组。 prediction 0 prediction 1 将被分成不同的组 用户名 . 呼叫 count 每组(注: 我改变了 is_bot 预测 计数 因为那是你想要的 ). 最后, unstack 0 1 到列和 rename 你想怎么做就怎么做

    df_out = (df.groupby(['username', 'prediction']).prediction.count().unstack(fill_value=0).
                 rename({0: 'count_human', 1: 'count_bot'}, axis= 1))
    
    Out[30]:
    prediction  count_human  count_bot
    username
    foo                   2          3
    foo1                  5          2
    foo2                  0          3
    

    一步一步地:

    按每组分组 用户名 预测 并指望每一组 , 每一个 用户名

    df.groupby(['username', 'prediction']).prediction.count()
    
    Out[32]:
    username  prediction
    foo       0             2
              1             3
    foo1      0             5
              1             2
    foo2      1             3
    Name: prediction, dtype: int64
    

    不后退放置索引 预测 到列

    df.groupby(['username', 'prediction']).prediction.count().unstack(fill_value=0)
    
    Out[33]:
    prediction  0  1
    username
    foo         2  3
    foo1        5  2
    foo2        0  3
    

    最后,重命名列以匹配所需的输出

    (df.groupby(['username', 'prediction']).prediction.count().unstack(fill_value=0).
        rename({0: 'count_human', 1: 'count_bot'}, axis= 1))
    
    Out[34]:
    prediction  count_human  count_bot
    username
    foo                   2          3
    foo1                  5          2
    foo2                  0          3
    
        2
  •  1
  •   BENY    5 年前

    让我们试试

    pd.crosstab(df.username, df.prediction)