【问题标题】:Manipulate count-data in python在python中操作计数数据
【发布时间】:2021-07-30 16:14:58
【问题描述】:

我有一个这样构成的犯罪攻击数据集:

日期 ------ 活动 ----

01/02/2019 ---- “x 被攻击” -----

01/02/2019 ----“你被攻击了”----

01/02/2019 ---- "" ----

03/02/2019 ---- “...” ----

我想知道 Python 中是否有一种有效的方法可以将这个数据集转换为计数时间序列。

也就是说,一个时间序列:

  • 日期之间没有跳转
  • 在第二列中有每个日期的事件数(包括 0)

类似的东西

日期 ------ 活动数量----

01/02/2019 ---- 3 ----

02/02/2019 ---- 0 ----

03/02/2019 ---- 1 ---- ...

非常感谢。

【问题讨论】:

标签: python pandas dataframe datetime counting


【解决方案1】:

假设您的数据集是 CSV 文件。然后就可以使用pandas.read_csv来读取文件了。

结果会是这样的:

import pandas as pd
df = pd.read_csv('data.csv') 
print(df)

    date        event
0   2021-01-01  x has been attacked
1   2021-01-01  y has been attacked
2   2021-01-01  z has been attacked
3   2021-01-02  a has been attacked
4   2021-01-03  e has been attacked
5   2021-01-03  b has been attacked
6   2021-01-04  c has been attacked
7   2021-01-05  d has been attacked

然后您可以使用pandas groupby 来获得您想要的结果

data = df.groupby("date").size().reset_index(name='number of events')
data["date"] =  pd.to_datetime(data["date"] )
final_df= pd.merge(pd.DataFrame({"date":pd.date_range(min(df.date),max(df.date))}),data,
                   on="date", how="outer").fillna(0)
print(final_df)


    date        number of events
0   2021-01-01  3.0
1   2021-01-02  0.0
2   2021-01-03  2.0
3   2021-01-04  1.0
4   2021-01-05  1.0

【讨论】:

    【解决方案2】:

    我会使用 groupby 按日期分组并获取每个日期的事件数。

    代码

    df['DATE']  = pd.to_datetime(df.DATE, dayfirst=True)
    df.groupby('DATE').count().reset_index().rename(columns={'EVENT':'Number of Events'})
    

    示例输入

    d="""DATE,EVENT
    01/02/2019,x has been attacked
    01/02/2019,y has been attacked
    01/02/2019,x attacked
    03/02/2019,z attacked
    03/02/2019,f attacked
    04/02/2019,a attacked
    05/02/2019,l attacked
    05/02/2019,q attacked"""
    df=pd.read_csv(StringIO(d))
    

    输出

        DATE        Number of Events
    0   2019-02-01  3
    1   2019-02-03  2
    2   2019-02-04  1
    3   2019-02-05  2
    

    场景 2:

    如果我们需要所有dates,包括没有像上述情况下的2019-02-02那样进行犯罪攻击的日期。

    resample可以用于这种情况。

    代码

    df['DATE']  = pd.to_datetime(df.DATE, dayfirst=True)
    df.set_index('DATE').resample('D').count().reset_index().rename(columns={'EVENT':'Number of Events'})
    

    输出

        DATE        Number of Events
    0   2019-02-01  3
    1   2019-02-02  0
    2   2019-02-03  2
    3   2019-02-04  1
    4   2019-02-05  2
    

    【讨论】:

      猜你喜欢
      • 2020-12-09
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2020-12-07
      • 1970-01-01
      • 2011-11-16
      相关资源
      最近更新 更多