【问题标题】:Plotting a datetime serie, counting the values for another serie绘制日期时间系列,计算另一个系列的值
【发布时间】:2020-08-19 17:31:08
【问题描述】:

我陷入了一个绘图问题。在寻求帮助之前,我做了一些研究。

我有一个如下所示的数据框:

date            text
2020-08-18      hey what's up?
2020-08-18      all good here
2020-08-17      happy Monday
2020-08-17      no news good news
2020-08-17      it's been a while
2020-08-16      see you tomorrow

长话短说,我正在尝试绘制一个垂直条形图或折线图,其中 ['date'] 作为我的 x,['text'] 的 COUNT 作为我的 y。 2020-08-18 有 2 个条目,2020-08-17 有 3 个条目,2020-08-16 有 1 个条目。

使用 SQL 我只需要执行以下操作:

SELECT date, COUNT(date) AS count_date FROM my_table GROUP BY date

使用 Python,我已经把事情复杂化了,这样做:

df['date_count'] = df.groupby(['date'])['date'].transform('size')
df_temporary = df.loc[ : , ['date', 'date_count'] ].drop_duplicates()

然后我可以绘制整个事情:

sns.plotline(data=df_temporary, x='date', y='date_count')

或其 Matplotlib 等效项:

plt.line(df_temporary.date, df_temporary.date_count)

它有效,但我的意思是,它不可能那么复杂,对吧?

什么是我没有看到的明显的东西?如何获取每个唯一日期的 COUNT?

【问题讨论】:

    标签: python pandas matplotlib seaborn


    【解决方案1】:

    最简单的是:

    ax = df.groupby('date').size().plot(kind='bar')
    

    这为您提供了一个非常简单的图表,您可以根据自己的喜好进行自定义:

    【讨论】:

    • 这与 Matplotlib 完美配合,非常感谢!
    【解决方案2】:

    您可以创建一个临时数据框,以计算每个日期的唯一日期。

    temp['date_count'] = df.groupby(['date'])['date'].nunique().reset_index()
    

    然后用它来绘制你的图表

    sns.plotline(data=temp, x='date', y='date_count')
    

    【讨论】:

    • 太好了,因为我也可以在 Altair 中使用它:) 谢谢!
    【解决方案3】:

    您确实很接近,语法实际上与 SQL 非常相似

    密钥是df.groupby(key to group by)[target column for agg function].count()

    import matplotlib.pyplot as plt
    from io import StringIO
    
    d = """date            text
    2020-08-18      hey what's up?
    2020-08-18      all good here
    2020-08-17      happy Monday
    2020-08-17      no news good news
    2020-08-17      it's been a while
    2020-08-16      see you tomorrow"""
    
    df = pd.read_csv(StringIO(d),sep='\s\s+',parse_dates=['date'])
    
    df.groupby('date')['date'].count().plot(kind='line',title='Count of Text by Date'
                                       )
    

    【讨论】:

    • 非常感谢您的帮助。我确实很接近,但到目前为止:)
    【解决方案4】:

    是的,你是对的。所有这些事情都可以在一条线上完成。

    plt.plot(df.groupby("date").apply(len))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      • 2021-08-15
      • 2021-12-19
      • 2021-03-13
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      相关资源
      最近更新 更多