Попытка построить и перегруппировать 2 фрейма данных

#python #pandas

#python #pandas

Вопрос:

Вот мой код :

 import pandas as pd
import io
data="""
;Barcode;Created;Hash;Modified;Tag;Tag2
0;9780735711020;2019-02-22T22:35:06.628Z;None;2019-02-22T22:35:06.628Z;NEED_PICS;
1;3178041328890;2019-02-22T22:37:44.546Z;None;2019-02-22T22:37:44.546Z;DISPLAY;
2;8718951129597;2019-02-23T04:53:17.925Z;None;2019-02-23T04:53:17.925Z;DISPLAY;
3;3770006053078;2019-02-23T05:25:56.454Z;None;2019-02-23T05:25:56.454Z;DISPLAY;
4;3468080404892;2019-02-23T05:26:39.923Z;None;2019-02-23T05:26:39.923Z;NEED_PICS;
5;3517360013757;2019-02-23T05:27:24.910Z;None;2019-02-23T05:27:24.910Z;DISPLAY;
6;3464660000768;2019-02-23T05:27:51.379Z;None;2019-02-23T05:27:51.379Z;DISPLAY;
7;30073357;2019-02-23T06:20:53.075Z;None;2019-02-23T06:20:53.075Z;NEED_PICS;
8;02992;2019-02-23T06:22:57.326Z;None;2019-02-23T06:22:57.326Z;NEED_PICS;
9;3605532558776;2019-02-23T06:23:45.010Z;None;2019-02-23T06:23:45.010Z;NEED_PICS;
10;3605532558776;2019-02-23T06:23:48.291Z;None;2019-02-23T06:23:48.291Z;NEED_PICS;
11;3605532558776;2019-02-23T06:23:52.579Z;None;2019-02-23T06:23:52.579Z;NEED_PICS;
"""
from io import StringIO
TESTDATA = StringIO(data)

df = pd.read_csv(TESTDATA, sep=";")
df["Created"] = pd.to_datetime(df["Created"],errors='coerce')
df["Barcode"] = df["Barcode"].astype(str)
df.set_index(df.columns[0], inplace=True)
df2 = df #df[df.Hash != "None"]
df3 = df2
df3 = df3.loc[df3.Tag == "DISPLAY"]
df = df2.merge(df3, on='Created', how='outer').fillna(0)
df['sum'] = df['Barcode_x'] df['Barcode_y']
df.plot(df['sum'], df['Created'])
  

Итак, в конце я пытаюсь построить двухстрочный график на одном графике.

Я хотел бы перегруппировать по дням количество встречаемости для двух фреймов данных df2 со всеми тегами и df3 только с отображением тега.

И я хотел бы построить 2 строки на одном графике, одну со всеми событиями за день за все время, а другую с отображением только тега.

На данный момент мне удалось получить только это :

введите описание изображения здесь

Комментарии:

1. Вы имеете в виду, что вам нужны два линейных графика, один из которых представляет количество тегов за день, а другой линейный график, представляющий количество «отображаемых» тегов за день?

2. @mujjiga да, пожалуйста

Ответ №1:

 import pandas as pd
import matplotlib.dates as mdates
import io
data="""
;Barcode;Created;Hash;Modified;Tag;Tag2
0;9780735711020;2019-02-22T22:35:06.628Z;None;2019-02-22T22:35:06.628Z;NEED_PICS;
1;3178041328890;2019-02-22T22:37:44.546Z;None;2019-02-22T22:37:44.546Z;DISPLAY;
2;8718951129597;2019-02-23T04:53:17.925Z;None;2019-02-23T04:53:17.925Z;DISPLAY;
3;3770006053078;2019-02-23T05:25:56.454Z;None;2019-02-23T05:25:56.454Z;DISPLAY;
4;3468080404892;2019-02-23T05:26:39.923Z;None;2019-02-23T05:26:39.923Z;NEED_PICS;
5;3517360013757;2019-02-23T05:27:24.910Z;None;2019-02-23T05:27:24.910Z;DISPLAY;
6;3464660000768;2019-02-23T05:27:51.379Z;None;2019-02-23T05:27:51.379Z;DISPLAY;
7;30073357;2019-02-23T06:20:53.075Z;None;2019-02-23T06:20:53.075Z;NEED_PICS;
8;02992;2019-02-23T06:22:57.326Z;None;2019-02-23T06:22:57.326Z;NEED_PICS;
9;3605532558776;2019-02-23T06:23:45.010Z;None;2019-02-23T06:23:45.010Z;NEED_PICS;
10;3605532558776;2019-02-23T06:23:48.291Z;None;2019-02-23T06:23:48.291Z;NEED_PICS;
11;3605532558776;2019-02-23T06:23:52.579Z;None;2019-02-23T06:23:52.579Z;NEED_PICS;
"""
from io import StringIO
TESTDATA = StringIO(data)

df = pd.read_csv(TESTDATA, sep=";")
df["Created"] = pd.to_datetime(df["Created"],errors='coerce').dt.date
df["Barcode"] = df["Barcode"].astype(str)
# custom date formatting
fig, ax = plt.subplots()
myFmt = mdates.DateFormatter('%Y-%m-%d')
ax.yaxis.set_major_formatter(myFmt)

df1 = df.groupby(["Created"])["Tag"].count().reset_index()
df2 = df[df["Tag"] == "DISPLAY"].groupby(["Created"])["Tag"].count().reset_index()
plt.plot(df1['Tag'], df1['Created'], label='ALL')
plt.plot(df2['Tag'], df2['Created'], label="DISPLAY")
plt.legend(loc='upper left')
plt.show()
  

![введите описание изображения здесь

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

 df["Created"] = pd.to_datetime(df["Created"],errors='coerce').dt.date
  

Вы можете изменить его в соответствии с вашими потребностями в зависимости от того, хотите ли вы разделить теги по дате, или по дате-часам, или по дате-часам-минутам и т. Д