【发布时间】: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