Python 使用分组执行NAs填充

Python 使用分组执行NAs填充,python,pandas,numpy,Python,Pandas,Numpy,我正在寻找一个解决方案,解决熊猫中数据帧非常大的问题 假设我有一个非常大的数据帧,其中包含NAs。我希望通过使用相同ID的行来填充NAs。我知道有些ID与我无关(请参阅示例代码中的数组“ID”) 我想出了以下代码: # relevant Ids ids = [2,3] # create example dataframe test = pd.DataFrame([[1,1,4],[1,np.nan,np.nan],[1,3,5],[2,np.nan,3],[2,5,5],[2,7,np.nan]

我正在寻找一个解决方案,解决熊猫中数据帧非常大的问题

假设我有一个非常大的数据帧,其中包含NAs。我希望通过使用相同ID的行来填充NAs。我知道有些ID与我无关(请参阅示例代码中的数组“ID”)

我想出了以下代码:

# relevant Ids
ids = [2,3]
# create example dataframe
test = pd.DataFrame([[1,1,4],[1,np.nan,np.nan],[1,3,5],[2,np.nan,3],[2,5,5],[2,7,np.nan],[3,4,np.nan],[3,np.nan,3],[3,8,9]],columns=['id','v1','v2'])
# fill NAs with the mean of the group defined by ID
test[test.id.isin(ids)] = pd.concat([test[test.id.isin(ids)].id,test[test.id.isin(ids)].groupby('id').transform(lambda x: x.fillna(x.mean()))],axis=1)
我在一个有循环的环境中使用它。 在每个循环中,大约1000行将被添加到数据帧中,我必须为这些行填充NAs

这意味着,我能从中获得的每一点表现都将非常棒。我试图避免创建数据帧的副本,因为这似乎更慢

也许有人有主意?例如,我认为应该避免使用isin()进行三次过滤,但如果不复制数据帧,我就找不到解决方案


我不是python或pandas方面的专家,所以我可能错过了一些东西。

看起来您正在做很多工作。您不能先替换所有缺少的值,然后再进行筛选吗

test[['v1', 'v2']] = test.groupby('id').transform(lambda x: x.fillna(x.mean()))
test[test.id.isin(ids)]
还有一种没有变换的方法

test.set_index('id') \
    .fillna(test.groupby('id').mean()) \
    .loc[ids] \
    .reset_index()

这里有一个NumPy解决方案,它可以遍历列-

a = test.values
ID = a[:,0].astype(int)
for i in range(1,test.shape[1]):
    nan_mask = np.isnan(a[:,i])
    ids_i = np.intersect1d(ID[~nan_mask], ids) # Account for at least 1 NaN grp
    valid_mask = np.in1d(ID, ids_i)
    m1 = ~nan_mask & valid_mask
    m2 = nan_mask & valid_mask
    s1 = np.bincount(ID[m1],a[m1,i])/np.bincount(ID[m1])
    test.iloc[m2,i] = s1[ID[m2],None]

通常有多少列?事实上,我很乐意为两列提供一个解决方案:例如ID和值。如果有多行带有NaN,我们将在所有这些行中填充相同的平均值。每行都有一个ID。但可能缺少值。如果是这种情况,请使用具有相同ID的所有行的平均值填充该值。发布的解决方案中有哪一个对您有效?此解决方案非常有效。然而:您知道如何在每个值都是nan的情况下计算ID吗?这给我带来了一个错误。我想忽略这些行。我认为如果数组m2中的ID没有出现在m1中,那么从数组m2中删除它就足够了。@hhlcks检查编辑,很可能是更好的编辑。