[英]pandas - partially updating DataFrame with derived calculations of a subset groupby
我有一個包含一些 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
我的當前解決方案(如下)對副本進行計算,然后更新原始數據幀。
# 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.