我有一个带有一些NaN记录的DataFrame,我希望根据NaN记录(本例中的索引)和非NaN记录的数据组合来填充。应修改原始DataFrame。
以下输入/输出/代码的详细信息:
我有一个初始DataFrame,其中包含一些预先计算的数据:
初始输入
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记录的一些数据。
在这个人为的例子中,我将其计算为:
最后,需要在初始DataFrame上更新。
所需输出
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
我当前的解决方案(下面)对副本进行计算,然后更新原始DataFrame。
# 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)
有没有更少笨重或更有效的方法来做到这一点?真正的应用程序是在更大的DataFrame上(并且处理NaN行的过程明显更长)。
提前致谢。
答案 0 :(得分:1)
您可以使用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