通过子集组的派生计算部分更新数据框



我有一个带有一些NAN记录的数据框,我想根据NAN记录的数据组合(本示例中的索引(和非NAN记录进行填写。原始数据帧应修改。

输入/输出/代码的详细信息:

我有一个初始数据框架,其中包含一些预估算的数据:

初始输入

raw_data = {'raw':[x for x in range(5)]+[np.nan for x in range(2)]}
source = pd.DataFrame(raw_data)
  raw
0 0.0
1 1.0
2 2.0
3 3.0
4 4.0
5 NaN
6 NaN

我想识别并执行计算以"更新" NAN数据,其中计算基于非NAN数据的数据以及NAN记录中的一些数据。

在这个人为的示例中,我将其计算为:

  • 计算"有效"记录的平均/平均值。
  • 将其添加到"无效"记录的索引号中。

最后,这需要在初始数据框架上进行更新。

所需的输出

  raw  valid
0 0.0      1
1 1.0      1
2 2.0      1
3 3.0      1
4 4.0      1
5 7.0      0
6 8.0      0

当前的解决方案(以下(对副本进行计算,然后更新原始数据框架。

# Setup grouping by NaN in 'raw'
source['valid'] = ~np.isnan(source['raw'])*1
subsets = source.groupby('valid')
# Mean of 'valid' is used later to fill 'invalid' records
valid_mean = subsets.get_group(1)['raw'].mean()
# Operate on a copy of group(0), then update the original DataFrame
invalid = subsets.get_group(0).copy()
invalid['raw'] = subsets.get_group(0).index + valid_mean
source.update(invalid)

这样做的方法较小或更有效?真正的应用程序在更大的数据范围内(以及处理NAN行的处理过程明显更长(。

预先感谢。

您可以使用combine_first

#mean by default omit `NaN`s
m = source['raw'].mean()
#same as
#m = source['raw'].dropna().mean()
print (m)
2.0
#create valid column if necessary
source['valid'] = source['raw'].notnull().astype(int)
#update NaNs
source['raw'] = source['raw'].combine_first(source.index.to_series() + m)
print (source)
   raw  valid
0  0.0      1
1  1.0      1
2  2.0      1
3  3.0      1
4  4.0      1
5  7.0      0
6  8.0      0

最新更新