【问题标题】:Code taking too much time for normalisation and Apply function in Pandas代码在 Pandas 中花费太多时间进行规范化和应用函数
【发布时间】:2019-03-01 10:00:05
【问题描述】:

这只是我的代码的示例数据。我想规范化其他列中的总列。目前我有大约 2000 个组,它需要 15 分钟进行标准化和 fgroup。

有什么方法可以减少时间。

import pandas as pd
import numpy as np

np.random.seed(1234)
n = 1500000

df = pd.DataFrame()
df['group'] = np.random.randint(1700, size=n)
df['ID'] = np.random.randint(5, size=n)
df['Total'] = np.random.randint(400, size=n)
df['Normalized_total'] = df.groupby('group')['Total'].apply(lambda x: (x-x.min())/(x.max()- x.min()))

def norm_group(df):
    if df['Normalized_total'] > 0.70 and df['group'] > 100 and df['ID'] > 3:
        return 3
    elif df['Normalized_total'] > 0.5 and df['group'] < 100 and df['ID'] < 3:
        return 2
    else:
        return 1

df['fgroup'] = df.apply(norm_group, axis=1)

谢谢

【问题讨论】:

  • 这不应该花费 15 分钟来运行,即使有 2000 个组。您的实际数据框有多长(我的意思是行数)?如果我将 n 提高到 15 M 并保持 ngroups=1700,对我来说仍然只需要 6 秒(我承认这并不快,但与 15 分钟相差甚远。)
  • 在我的原始数据集中,我有 2000 个组。数据框的形状是 (1200000, 40)。不知道为什么这段代码要花太多时间。
  • 是的,我只是在这么大的框架上试了一下,不到一秒钟。真实数据的列的dtypes是什么?
  • 30 列是对象,5 列是 int,其余是浮点数。
  • 等等,你已经编辑了代码。你是说它实际上是df.apply,甚至在你的原始代码中都没有,这是慢点?

标签: python python-3.x pandas


【解决方案1】:

您可以使用transform 并定义自己的功能

%timeit df['Normalized_total'] = df.groupby('group')['Total'].apply(lambda x: (x-x.min())/(x.max()- x.min()))
1 loop, best of 3: 508 ms per loop

# below is my solution
def myfunc():
    g=df.groupby('group')['Total']
    return df['Total']-g.transform('min')/g.transform(np.ptp)
%timeit myfunc()
1 loop, best of 3: 398 ms per loop

【讨论】:

  • 我已经编辑了我的问题,请您查看一下。
猜你喜欢
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
相关资源
最近更新 更多