簡體   English   中英

pandas - 使用子集 groupby 的派生計算部分更新 DataFrame

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM