python - Pandas 重采样代码运行速度极慢
问题描述
我需要重新采样 Pandas 中的一些数据,我正在使用以下代码:
根据我的数据,5 hours
.
df['date'] = pd.to_datetime(df['date'], format='%y-%m-%d')
df = df.set_index('date')
df.groupby('id').resample('D')['value'].agg('sum').loc[lambda x: x>0]
这是非常缓慢的。
如何在以下数据上加快上述代码的速度:
id date value
1 16-12-1 9
1 16-12-1 8
1 17-1-1 18
2 17-3-4 19
2 17-3-4 20
1 17-4-3 21
2 17-7-13 12
3 17-8-9 12
2 17-9-12 11
1 17-11-12 19
3 17-11-12 21
giving output:
id date
1 2016-12-04 17
2017-01-01 18
2017-04-09 21
2017-11-12 19
2 2017-03-05 39
2017-07-16 12
2017-09-17 11
3 2017-08-13 12
2017-11-12 21
Name: value, dtype: int64
我将日期设置为索引,但代码太慢了。任何帮助都会很棒。
解决方案
试试这个。我将使用pd.Grouper()
并指定频率为每天,希望它更快。另外,我正在摆脱agg
并.sum()
立即使用。
df['date'] = pd.to_datetime(df['date'], format='%y-%m-%d')
df = df.set_index('date')
df2 = df.groupby(['id',pd.Grouper(freq='D')])['value'].sum()
结果:
id date
1 2016-12-01 17
2017-01-01 18
2017-04-03 21
2017-11-12 19
2 2017-03-04 39
2017-07-13 12
2017-09-12 11
3 2017-08-09 12
2017-11-12 21
希望这有效。
[编辑]
所以我只是在两种方法之间对随机生成的 df 进行了一个小测试,其中包含 100000 行
df = pd.DataFrame(np.random.randint(0, 30,size=100000),
columns=["id"],
index=pd.date_range("19300101", periods=100000))
df['value'] = np.random.randint(0, 10,size=100000)
并在两个代码上进行了尝试,结果是:
使用resmple
:
startTime = time.time()
df2 = df.groupby('id').resample('D')['value'].agg('sum').loc[lambda x: x>0]
print(time.time()-startTime)
1.0451831817626953 seconds
使用pd.Grouper()
:
startTime = time.time()
df3 = df.groupby(['id',pd.Grouper(freq='D')])['value'].sum()
print(time.time()-startTime)
0.08430838584899902 seconds
所以大约快 12 倍!(如果我的数学是正确的)
推荐阅读
- python - 在 Dataframe 上进行 Pandas 列搜索,Pandas 搜索功能的复杂性和优化
- firebase - 如何在服务器端(后端)运行事件处理程序代码?
- python-3.x - jupyter contrib nbextension install --user 错误
- typescript - 打字稿:如何从其他参数派生参数类型
- c++ - C++ 从 txt 文件中读取 UTF-8(立陶宛字母)符号并在控制台应用程序中显示它们
- aws-nuke - 如果 aws-nuke 大多失败,如何对 aws 进行核攻击
- r - 如何订购分组箱线图?
- python - 无法通过任何方法通过 Speech_recognition python 获取音频?
- react-native - 如何在本机反应中添加显示更多和显示更少按钮并根据它们呈现项目
- r - Shiny R:需要相互更新的两个 selectizeInput 菜单(互斥选择)