作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了一些关于平均数据帧的答案,但没有一个包含权重处理。我想出了一种方法来达到我想要的结果(见标题),但我想知道是否有更直接的方法来实现相同的目标。
编辑:我需要对不止两个数据帧进行平均,但是下面的示例代码只包含其中两个。
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])
masked = np.ma.masked_array(arrayOfArrays,
np.isnan(arrayOfArrays))
arrayAve = np.ma.average(masked,
axis = 0,
weights = [1,2])
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/
我是一名优秀的程序员,十分优秀!