gpt4 book ai didi

python - 带有 NaN 掩码的数据帧的加权平均值

转载 作者:行者123 更新时间:2023-12-04 06:04:39 25 4
gpt4 key购买 nike

我找到了一些关于平均数据帧的答案,但没有一个包含权重处理。我想出了一种方法来达到我想要的结果(见标题),但我想知道是否有更直接的方法来实现相同的目标。

编辑:我需要对不止两个数据帧进行平均,但是下面的示例代码只包含其中两个。

import pandas as pd
import numpy as np

df1 = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))

df2 = pd.DataFrame([[3, 1, np.nan, 1],
[2, 5, np.nan, 3],
[np.nan, 4, np.nan, 2],
[np.nan, 2, 1, 5]],
columns=list('ABCD'))

我做的是:

  • 将每个数据帧转换为数组(行)数组,将所有如此转换的数据帧放入一个数组中:
def fromDfToArraysStack(df):

for i in range(len(df)):
arrayRow = df.iloc[i].values

if i == 0:
arraysStack = arrayRow
else:
arraysStack = np.vstack((arraysStack, arrayRow))

return arraysStack

arraysStack1 = fromDfToArraysStack(df1)
arraysStack2 = fromDfToArraysStack(df2)
arrayOfArrays = np.array([arraysStack1, arraysStack2])
  • 对 nans 应用 mask 并取平均值:
masked = np.ma.masked_array(arrayOfArrays,
np.isnan(arrayOfArrays))
arrayAve = np.ma.average(masked,
axis = 0,
weights = [1,2])
  • 转换回数据框,同时将 nans 放回:
pd.DataFrame(np.row_stack(arrayAve.filled(np.nan)))

0 1 2 3
0 3.000000 1.333333 NaN 0.666667
1 2.333333 4.666667 NaN 2.333333
2 NaN 4.000000 NaN 3.000000
3 NaN 2.333333 1.0 4.666667

正如我所说,这行得通,但希望有更简洁的方法来做到这一点,有人吗?

最佳答案

为了使它成为一个整洁的单行,我在导入方面做了一些欺骗,但这是我能做的最好的:

import pandas as pd
import numpy as np
from numpy.ma import average as avg
from numpy.ma import masked_array as ma

df1 = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))

df2 = pd.DataFrame([[3, 1, np.nan, 1],
[2, 5, np.nan, 3],
[np.nan, 4, np.nan, 2],
[np.nan, 2, 1, 5]],
columns=list('ABCD'))

df1.combine(df2, lambda x, y: avg([ma(x, np.isnan(x)), ma(y, np.isnan(y))], 0, [1, 2]))

编辑:

import pandas as pd
import numpy as np
from numpy.ma import average as avg
from numpy.ma import masked_array as ma

df1 = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))

df2 = pd.DataFrame([[3, 1, np.nan, 1],
[2, 5, np.nan, 3],
[np.nan, 4, np.nan, 2],
[np.nan, 2, 1, 5]],
columns=list('ABCD'))

def df_average(dfs, wgts):
return pd.DataFrame(avg([ma(df.values, np.isnan(df.values)) for df in dfs], 0, wgts))


df_average(dfs=[df1, df2], wgts=[1, 2])

关于python - 带有 NaN 掩码的数据帧的加权平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60509013/

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