代码之家  ›  专栏  ›  技术社区  ›  sectechguy

Pandas按2列分组,并计算T和F的实例以创建2个新列

  •  0
  • sectechguy  · 技术社区  · 5 年前

    这个问题已经有了答案:

    我有一个pandas数据框,有3列: source_name , dest_address ,和 fall_between . 我想按前两列分组,并根据 介于 列。这就是df的样子:

    df           
       source_name  dest_address   fall_between
    0  source_1     72.21.215.90   False
    1  source_1     72.21.215.90   False
    2  source_1     72.21.215.90   False
    3  source_1     72.21.215.90   False
    4  source_1     131.107.0.89   False
    5  source_1     131.107.0.89   False
    6  source_2     69.63.191.1    False
    7  source_2     69.63.191.1    True
    8  source_2     69.63.191.1    True
    9  source_2     69.63.191.1    True
    10 source_2     69.63.191.1    True
    

    期望输出:

    df
       source_name  dest_address   true_count  false_count
    0  source_1     72.21.215.90   0           4
    1  source_1     131.107.0.89   0           2  
    2  source_2     69.63.191.1    4           1
    

    我使用了下面的代码,但如果是0,我就无法计数。做这件事的更好方法是什么?

    df[df['fall_between'] == True].groupby(['source_name','dest_address']).size().reset_index(name='true_count')
    df[df['fall_between'] == False].groupby(['source_name','dest_address']).size().reset_index(name='false_count')
    
    0 回复  |  直到 5 年前
        1
  •  4
  •   yatu Sayali Sonawane    5 年前

    你可以用 pd.crosstab :

    pd.crosstab([df.source_name, df.dest_address], df.fall_between).reset_index()
    
    fall_between  source_name  dest_address  False  True
    0               source_1  131.107.0.89      2     0
    1               source_1  72.21.215.90      4     0
    2               source_2   69.63.191.1      1     4
    
        2
  •  2
  •   clarktwain    5 年前

    既然你想包括0,我想知道使用0是否更有意义 .value_counts() .

    看一看: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.value_counts.html