处理 python 中的计数数据
Manipulate count-data in python
我有一个以这种方式构建的一些犯罪攻击的数据集:
日期 ------ 事件 ----
01/02/2019 ----“x已被攻击”-----
01/02/2019 ----“y已被攻击”----
01/02/2019 ---- "" ----
03/02/2019 ----“...”----
我想知道 Python 中是否有一种有效的方法可以在计数时间序列中转换此数据集。
即时间序列:
- 日期之间没有跳跃
- 第二列是每个日期的事件数(包括 0)
像那样
日期 ------ 事件数 ----
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
我有一个以这种方式构建的一些犯罪攻击的数据集:
日期 ------ 事件 ----
01/02/2019 ----“x已被攻击”-----
01/02/2019 ----“y已被攻击”----
01/02/2019 ---- "" ----
03/02/2019 ----“...”----
我想知道 Python 中是否有一种有效的方法可以在计数时间序列中转换此数据集。
即时间序列:
- 日期之间没有跳跃
- 第二列是每个日期的事件数(包括 0)
像那样
日期 ------ 事件数 ----
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