我在Pandas 身上遇到了一个与时间消耗有关的问题:

代码如下所示:

df = pd.DataFrame({"IDs": [1, 1, 1, 2, 2, 2, 3, 3, 3],
                   "Month": ["01", "02", "01", "01", "02", "01", "01", "02", "01"],
                   "column1": [0.9, 0.5, 0.3, 0.8, 0.5, 0.1, 0.6, 0.2, 0.8]})

df_list = []
for id in df.IDs.unique():
    temp = df[df.IDs == id]
    temp = temp.groupby("Month").mean()
    temp2 = temp['column1'].ewm(span=3, adjust=True).sum()
    df_list.append(temp2)

注意,unique IDs包含约500k个元素,原始数据帧df包含约6mil个记录.

现在我用tqdm判断估计的时间,需要14-15个小时才能完成.如果我只有temp = df[df.IDs == id]行的偶数循环,并且估计的时间是相同的(基本上这些都是pandas函数,所以应该不会产生任何性能问题).所以问题就在这条线上.

有没有其他方法可以做到这一点?谢谢你的建议.

推荐答案

out = (df.groupby(['IDs', 'Month'])
         .mean()['column1']
         .ewm(span=3, adjust=True)
         .sum())
print(out.reset_index())

输出:

   IDs Month  column1
0    1    01  0.60000
1    1    02  0.80000
2    2    01  0.85000
3    2    02  0.92500
4    3    01  1.16250
5    3    02  0.78125

out = (df.groupby('IDs')
         .apply(lambda x: x.groupby('Month')
                           .mean()['column1']
                           .ewm(span=3, adjust=True)
                           .sum())
         .stack())
print(out.reset_index(name='column1'))

输出:

   IDs Month  column1
0    1    01    0.600
1    1    02    0.800
2    2    01    0.450
3    2    02    0.725
4    3    01    0.700
5    3    02    0.550

Python相关问答推荐

运行终端命令时出现问题:pip start anonymous"

根据二元组列表在pandas中创建新列

当独立的网络调用不应该互相阻塞时,'

OR—Tools中CP—SAT求解器的IntVar设置值

ThreadPoolExecutor和单个线程的超时

Python导入某些库时非法指令(核心转储)(beautifulsoup4."" yfinance)

python中的解释会在后台调用函数吗?

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

try 检索blob名称列表时出现错误填充错误""

Python—压缩叶 map html作为邮箱附件并通过sendgrid发送

干燥化与列姆化的比较

不允许 Select 北极滚动?

数据框,如果值在范围内,则获取范围和

如何在Airflow执行日期中保留日期并将时间转换为00:00

文本溢出了Kivy的视区

如何关联来自两个Pandas DataFrame列的列表项?

有没有一种方法可以根据不同索引集的数组从2D数组的对称子矩阵高效地构造3D数组?

牛郎星直方图中分类列的设置顺序

从pandas框架中删除重复的子框架

对齐多个叠置多面Seborn CAT图