依靠布尔变量

时间:2019-10-03 21:14:50

标签: python dataframe count boolean

我有一个包含几列的数据帧(事件):id,...,click,...列“ click”是一个布尔变量,其值为'True'或'False'。我在下面使用Python中的代码来计算每个“ id”的“ True”数:

click_yes = events.groupby("id")["click"].count(True).reset_index()

出现错误:TypeError: count() takes 1 positional argument but 2 were given


示例输出:

如果情况类似于此原始数据框:

   id  click
0   0   True
1   1   False
2   1   True
3   1   True
4   2   True
5   2   False
6   3   False

我希望结果是一个新的数据框,如下所示(以“ True”的数量为准):

   id  click_count
0   0   1
1   1   2
2   2   1
3   3   0

如何修改我的以下代码(不起作用)或编写新代码以实现我的期望?

click_yes = events.groupby(“ id”)[“ click”]。count(True).reset_index() 谢谢!!!

正确的方法是什么?

非常感谢您!

4 个答案:

答案 0 :(得分:0)

您可以改用sum()-因为True的值为1,而False的值为0。

答案 1 :(得分:0)

>>> sum(map(bool,[True, True, False, False, False, True]))
3
  

答案为3,因为 True == 1

或仅求和:

>>> sum([True, True, False, False, False, True])
3

或使用count():

lst = [True, True, False, False, False, True] 
print(count(lst)

答案 2 :(得分:0)

我假设您使用的是熊猫数据框,所以我添加了一种快速方法。顺便说一句:实际上,您对count的使用是错误的。它只能返回某些内容(例如列表)的长度,而不能用作过滤器。

当您添加了所需的输出时,我现在了解您要实现的目标。我添加了一个新片段。我再次过滤“真实”值。在下一行中,我将根据列的内容开始对行进行求和。

import pandas as pd

# Create your list
# initialize list of lists
data = [ [0, True], [1, False], [1, True], [5, True], [2, True], 
         [2, False], [3, False], [2, True], [4, False], [1, True],
         [6, True], [2, True]]

# Create the pandas DataFrame
df = pd.DataFrame(data, columns=['id', 'click'])
df = df.sort_values(by=['id'])


#------------------------------------------------------------------------------#

# Filter for key value true
df = df[df.click == True]
# Merge lines depending of it's column content
filtered =  df.groupby('id').agg({ 'click':'sum'}).reset_index()
# If we need it, rename the column
filtered = filtered.rename(columns={"click": "click_count"})


# Print out the list
print(filtered)

如果这是您的输入(数据框):

    id  click
0    0   True
1    1  False
2    1   True
9    1   True
4    2   True
5    2  False
7    2   True
11   2   True
6    3  False
8    4  False
3    5   True
10   6   True

使用摘录,您将获得以下输出:

    id  click_count
0   0          1.0
1   1          2.0
2   2          3.0
3   5          1.0
4   6          1.0

答案 3 :(得分:0)

感谢所有答案!赞赏!

如果是这样的话:

原始数据框:

public void Post(List<InsertNotificationLogs> request)
{
    var notifications = request.ConvertTo<List<NotificationLogs>>();
    notifications.ForEach(x => x.AuditUserId = UserAuth.Id);
    Db.InsertAll(notifications);
}

我希望结果是一个新的数据框,如下所示(以“ True”的数量为准):

   id  click
0   0   True
1   1   False
2   1   True
3   1   True
4   2   True
5   2   False
6   3   False

如何修改我的以下代码(不起作用)或编写新代码以实现我的期望?

   id  click_count
0   0   1
1   1   2
2   2   1
3   3   0

谢谢!!!