рассчитывать на булеву переменную - PullRequest
0 голосов
/ 04 октября 2019

У меня есть датафрейм (события), имеющий несколько столбцов: id, ..., click, ... Столбец «click» - это логическая переменная, значение которой равно «True» или «False». Я использую код в Python ниже, чтобы посчитать число «True» для каждого отдельного «id»:

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 голосов
/ 04 октября 2019

Спасибо за все ответы! Цените это!

Если случай таков:

Исходный фрейм данных:

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

Я хочу, чтобы результатом стал новый фрейм данных, например так (рассчитывайте на числоof '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()

Спасибо !!!

0 голосов
/ 04 октября 2019
>>> sum(map(bool,[True, True, False, False, False, True]))
3

Ответ - 3, потому что True == 1

или только сумма:

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

Или с использованием счетчика ():

lst = [True, True, False, False, False, True] 
print(count(lst)
0 голосов
/ 04 октября 2019

Я предполагаю, что вы используете пандафреймы, поэтому я добавил быстрый подход. Кстати: на самом деле вы используете 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
0 голосов
/ 04 октября 2019

Вместо этого можно использовать sum() - поскольку значение True равно 1, а False равно 0.

...