在Python中使用size()在数据框中输出为零

时间:2019-06-16 15:05:56

标签: python pandas pandas-groupby

我有一个文件,该文件由三列组成:A,B和C,带有一些整数。使用python,让我说我想grouby()列'A'并在'B'列中获取数字大于4,6和8的每个组的size()。因此,我实现了以下代码:

    >>> import pandas as pd
    >>> 
    >>> df = pd.read_csv("test.txt", sep="\t")
    >>> df
       A  B   C
    0  1  4   3
    1  1  5   4
    2  1  2  10
    3  2  7   2
    4  2  4   4
    5  2  6   6
    >>> 
    >>> out1 = df[df['B'] > 4].groupby(['A']).size().reset_index()
    >>> out1
       A  0
    0  1  1
    1  2  2
    >>> out2 = df[df['B'] > 6].groupby(['A']).size().reset_index()
    >>> out2
       A  0
    0  2  1
    >>> out3 = df[df['B'] > 8].groupby(['A']).size().reset_index()
    >>> out3
    Empty DataFrame
    Columns: [A, 0]
    Index: []
    >>> 

out1是我想要的输出。但是对于out2out3,如何获得类似于out1的数据帧,如下所示为零?

out2:
   A  0
0  2  1
1  2  0

out3:
   A  0
0  2  0
1  2  0

谢谢。

1 个答案:

答案 0 :(得分:3)

想法是创建布尔掩码,转换为整数并聚合sum-这是必要的,需要像Series那样按df['A']进行分组,而不要按列名A进行分组:

out3 = (df['B'] > 8).astype(int).groupby(df['A']).sum().reset_index()
#alternative
#out3 = (df['B'] > 8).view('i1').groupby(df['A']).sum().reset_index()
print (out3)
   A  B
0  1  0
1  2  0

另一个想法是创建帮助器列-例如将B分配给新值,然后聚合sum

out3 = df.assign(B = (df['B'] > 8).astype(int)).groupby('A')['B'].sum().reset_index()
print (out3)
   A  B
0  1  0
1  2  0