Tengo un marco de datos (eventos) que tiene varias columnas: id, ..., clic, ... La columna "clic" es una variable booleana que tiene el valor 'Verdadero' o 'Falso'. Uso el código en Python a continuación para contar el número de 'Verdadero' para cada "id" individual:

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

Salió un error: TypeError: count() takes 1 positional argument but 2 were given


Salida de ejemplo:

Si el caso es como este marco de datos original:

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

Quiero que el resultado sea un nuevo marco de datos, como este (cuente con el número de 'Verdadero'):

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

¿Cómo modificar mi siguiente código (no funciona) o escribir un nuevo código para que mi expectativa suceda?

Click_yes = events.groupby ("id") ["click"]. count (True) .reset_index () ¡Gracias!

¿Cuál es la forma correcta de hacer esto?

¡Muchas gracias!

0
Hsin Lee 4 oct. 2019 a las 00:14

4 respuestas

La mejor respuesta

En su lugar, puede usar sum(), ya que el valor de True es 1 y False es 0.

0
Hadas Arik 3 oct. 2019 a las 21:26

Gracias por todas las respuestas! ¡Lo aprecio!

Si el caso es así:

Marco de datos original:

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

Quiero que el resultado sea un nuevo marco de datos, como este (cuente con el número de 'Verdadero'):

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

¿Cómo modificar mi siguiente código (no funciona) o escribir un nuevo código para que mi expectativa suceda?

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

Gracias !!!

0
Hsin Lee 4 oct. 2019 a las 03:57

Supongo que está utilizando marcos de datos de panda, por lo que he agregado un enfoque rápido. Por cierto: en realidad, tu uso de count es incorrecto. Solo puede devolver la longitud de algo (por ejemplo, una lista) pero no se puede usar como filtro.

Como ha agregado el resultado deseado, ahora entiendo lo que intenta lograr. He agregado un nuevo fragmento. Nuevamente filtro por valores 'verdaderos'. En la siguiente línea empiezo a sumar líneas dependiendo del contenido de su columna.

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)

Si esta es su entrada (marco de datos):

    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

Con el fragmento obtendrás el siguiente resultado:

    id  click_count
0   0          1.0
1   1          2.0
2   2          3.0
3   5          1.0
4   6          1.0
0
agentsmith 7 oct. 2019 a las 07:42
>>> sum(map(bool,[True, True, False, False, False, True]))
3

La respuesta es 3, porque True == 1

O solo Suma:

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

O usando count ():

lst = [True, True, False, False, False, True] 
print(count(lst)
0
Van Gran 3 oct. 2019 a las 21:39
58226975