Построение количества вхождений за дату - PullRequest
0 голосов
/ 10 октября 2019

Я очень плохо знаком с фреймом данных pandas, в котором есть столбец даты и времени, а также столбец, содержащий строку текста (заголовки). Каждый заголовок будет новой строкой.

Мне нужно нанести дату на ось X, а на оси Y должно быть указано, сколько раз заголовок встречается на каждую дату.

Так, например, одна дата может содержать 3 заголовка.

Какой самый простой способ сделать это? Я не могу понять, как это сделать вообще. Может быть, добавить еще один столбец с '1' для каждой строки? Если да, то как бы вы это сделали?

Пожалуйста, укажите мне, что может помочь!

Спасибо вам!

Я попытался построить счетчик нау, но продолжаю получать ошибки, я попытался создать переменную, которая подсчитывает количество строк, но она также не вернула ничего полезного.

Я попытался добавить столбец с количеством заголовков

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

и я попробовал группу по методу

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

Когда я использую groupie, я получаю ошибку

KeyError: 'headlines'

Выходными данными должен быть просто график с количествомраз дата повторяется в кадре данных (который указывает на наличие нескольких заголовков) в строках, нанесенных на ось Y. И ось X должна быть датой, когда произошли наблюдения.

Ответы [ 3 ]

1 голос
/ 10 октября 2019

Попробуйте:

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"]] )

Ваши данные выглядят так:

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

Теперь создайте группу по операции с ней:

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

Вы можетеТеперь нанесите его, используя следующий код:

# 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

Надеюсь, это поможет!

1 голос
/ 10 октября 2019

Вы пробовали это:

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

Вы должны сохранить результаты этого в новом фрейме данных (df2), а не в другом столбце, потому что результат groupby не будет иметь те же размерыисходный фрейм данных.

1 голос
/ 10 октября 2019

Используйте Series.value_counts со столбцом date для Series с Series.sort_index или 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

И последнее использование Series.plot:

s.plot()
...