Python pandas-使用子集groupby的派生计算部分更新数据帧

Python pandas-使用子集groupby的派生计算部分更新数据帧,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个包含一些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记录的数据框,我希望根据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
  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
我想确定并执行计算以“更新”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
  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行的过程要长得多)

提前感谢。

您可以使用:


谢谢,这对我来说很有效。如果我在一个更大的数据帧上操作,你会建议用不同的方式来做吗?假设NaN行占200万行的5%,NaN更新方法不容易矢量化(在这个简单的例子中就是这样)。@mpny1-你能解释更多吗?只能通过函数更新
NaN
s行,方法是
source.loc[source['valid']==0,'raw']=source.loc[source['valid']==0,'raw']。应用(func)