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

时间:2019-02-14 18:45:52

标签: python pandas pandas-groupby

我有一个3列的熊猫数据框:source_namedest_addressfall_between。我想按前两列进行分组,并根据fall_between列创建2个新列。 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')

2 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分:2)

由于您要包含0,所以我想知道使用.value_counts()是否更有意义。

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