Soy muy nuevo en el marco de datos de pandas que tiene una columna de fecha y hora y una columna que contiene una cadena de texto (encabezados). Cada título será una nueva fila.

Necesito trazar la fecha en el eje x, y el eje y debe contener cuántas veces aparece un título en cada fecha.

Entonces, por ejemplo, una fecha puede contener 3 titulares.

¿Cuál es la forma más sencilla de hacer esto? No puedo entender cómo hacerlo en absoluto. ¿Quizás agregar otra columna con un '1' para cada fila? Si es así, ¿cómo harías esto?

¡Por favor apúnteme en la dirección de cualquier cosa que pueda ayudar!

¡Gracias!

Intenté trazar el recuento en la y, pero seguí obteniendo errores, intenté crear una variable que cuente el número de filas, pero que tampoco devolvió nada de uso.

Traté de agregar una columna con el recuento de titulares

df_data['headline_count'] = df_data['headlines'].count

Y probé el grupo por método

df_data['count'] = df.groupby('headlines')['headlines'].transform('count')

Cuando uso groupie, recibo un error de

KeyError: 'headlines'

La salida debería ser simplemente un gráfico con cuántas veces se repite una fecha en el marco de datos (lo que indica que hay varios encabezados) en las filas trazadas en el eje y. Y el eje x debe ser la fecha en que ocurrieron las observaciones.

0
drandom3 10 oct. 2019 a las 13:04

3 respuestas

La mejor respuesta

Prueba esto:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

A = pd.DataFrame(columns=["Date", "Headlines"], data=[["01/03/2018","Cricket"],["01/03/2018","Football"],
                                                    ["02/03/2018","Football"],["01/03/2018","Football"],
                                                    ["02/03/2018","Cricket"],["02/03/2018","Cricket"]] )

Sus datos se ven así:

print (A)

       Date Headlines
0   01/03/2018  Cricket
1   01/03/2018  Football
2   02/03/2018  Football
3   01/03/2018  Football
4   02/03/2018  Cricket
5   02/03/2018  Cricket

Ahora haga un grupo por operación en él:

data = A.groupby(["Date","Headlines"]).size()
print(data)

Date        Headlines
01/03/2018  Cricket      1
            Football     2
02/03/2018  Cricket      2
            Football     1
dtype: int64

Ahora puede trazarlo usando el siguiente código:

# set width of bar
barWidth = 0.25

# set height of bar
bars1 = data.loc[(data.index.get_level_values('Headlines') =="Cricket")].values
bars2 = data.loc[(data.index.get_level_values('Headlines') =="Football")].values


# Set position of bar on X axis
r1 = np.arange(len(bars1))
r2 = [x + barWidth for x in r1]

# Make the plot
plt.bar(r1, bars1, color='#7f6d5f', width=barWidth, edgecolor='white', label='Cricket')
plt.bar(r2, bars2, color='#557f2d', width=barWidth, edgecolor='white', label='Football')

# Add xticks on the middle of the group bars
plt.xlabel('group', fontweight='bold')
plt.xticks([r + barWidth for r in range(len(bars1))], data.index.get_level_values('Date').unique())

# Create legend & Show graphic
plt.legend()
plt.xlabel("Date")
plt.ylabel("Count")
plt.show()

enter image description here

¡Espero que esto ayude!

1
Parthasarathy Subburaj 10 oct. 2019 a las 10:58

Utilice Series.value_counts con la columna date para Series con Series.sort_index o GroupBy.size:

df = pd.DataFrame({'date':pd.to_datetime(['2019-10-10','2019-10-10','2019-10-09']),
                   'col1':['a','b','c']})

s = df['date'].value_counts().sort_index()
#alternative  
#s = df.groupby('date').size()

print (s)
2019-10-09    1
2019-10-10    2
Name: date, dtype: int64

Y el último uso Series.plot:

s.plot()
2
jezrael 10 oct. 2019 a las 10:28

¿Has probado esto?

df2 = df_data.groupby(['headlines']).count()

Debe guardar los resultados de esto en un nuevo marco de datos (df2) y no en otra columna porque el resultado de groupby no tendrá las mismas dimensiones del marco de datos original.

1
benja d 10 oct. 2019 a las 12:52
58320398