我有一个文件,该文件由三列组成: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
是我想要的输出。但是对于out2
和out3
,如何获得类似于out1
的数据帧,如下所示为零?
out2:
A 0
0 2 1
1 2 0
out3:
A 0
0 2 0
1 2 0
谢谢。
答案 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