gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:05:05 24 4
gpt4 key购买 nike

我有一个包含一些 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 行的过程明显更长)。

提前致谢。

最佳答案

您可以使用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

关于python - pandas - 使用子集 groupby 的派生计算部分更新 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48959956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com