处理 python 中的计数数据

Manipulate count-data in python

我有一个以这种方式构建的一些犯罪攻击的数据集:

日期 ------ 事件 ----

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

01/02/2019 ----“y已被攻击”----

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

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

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

即时间序列:

像那样

日期 ------ 事件数 ----

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

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

03/02/2019 ---- 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

我会使用 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