【发布时间】:2017-04-02 14:34:34
【问题描述】:
我需要用每组中的平均值填充 pandas DataFrame 中的缺失值。根据this questiontransform可以实现这个。
但是,transform 对我来说太慢了。
例如,对具有 100 个不同组和 70% NaN 值的大型 DataFrame 进行以下设置:
import pandas as pd
import numpy as np
size = 10000000 # DataFrame length
ngroups = 100 # Number of Groups
randgroups = np.random.randint(ngroups, size=size) # Creation of groups
randvals = np.random.rand(size) * randgroups * 2 # Random values with mean like group number
nan_indices = np.random.permutation(range(size)) # NaN indices
nanfrac = 0.7 # Fraction of NaN values
nan_indices = nan_indices[:int(nanfrac*size)] # Take fraction of NaN indices
randvals[nan_indices] = np.NaN # Set NaN values
df = pd.DataFrame({'value': randvals, 'group': randgroups}) # Create data frame
通过transform 使用
df.groupby("group").transform(lambda x: x.fillna(x.mean())) # Takes too long
在我的计算机上已经花费了 3 秒以上。我需要快一个数量级的东西(购买更大的机器不是一种选择:-D)。
那么我怎样才能更快地填充缺失值呢?
【问题讨论】:
-
是否可以在将丢失的数据读入帧之前对其进行处理?
-
嗯,我不确定。我不希望这样做,因为真正的 DataFrame 来自 SQL 查询(实际上是几 GB 大小)。
-
我会考虑在那里做。如果 SQL 能够比 Pandas 更快地计算平均值,我不会感到惊讶。
标签: python pandas nan python-3.5 mean