获取两个缺失值的数据框的平均值

时间:2018-08-03 16:31:24

标签: python pandas

我有两个DataFrame,我试图将其包含两个平均值。每个都有缺失的值。

如果没有缺失的值,我可以使用(df1 + df2)/ 2。

我想对同时具有两个数据点的那些数据取平均值,同时将“ NaN”作为缺少数据的数据点的“平均值”。

例如:

df1 = pd.DataFrame({'ID': ['Alpha', 'Bravo', 'Charlie', 'Delta'], 'Var1': [15,'NaN', 17, 18], 'Var2': [1.0, 1.5, 2.0, 1.5], 'Var3': [1, 0, 0, 1]})   

df1 = df1.set_index('ID')

        Var1  Var2  Var3
ID                      
Alpha     15   1.0     1
Bravo    NaN   1.5     0
Charlie   17   2.0     0
Delta     18   1.5     1

_

df2 = pd.DataFrame({'ID': ['Alpha', 'Bravo', 'Charlie', 'Delta'], 'Var1': [20, 15, 17, 20], 'Var2': [1.2,'NaN', 3.0, 1.0], 'Var3': [0, 0, 1, 1]})

df2=df2.set_index('ID')

         Var1 Var2  Var3
ID                      
Alpha      20  1.2     0
Bravo      15  NaN     0
Charlie    17    3     1
Delta      20    1     1

_

结果DataFrame应该是:

         Var1   Var2  Var3
ID                      
Alpha      17.5  1.10  0.5
Bravo      NaN   NaN   0.0
Charlie    17.0  2.50  0.5
Delta      19.0  1.25  1.0

所以,简单来说,我的问题是在忽略具有NaN的点时如何做(df1 + df2)/ 2?

3 个答案:

答案 0 :(得分:5)

您可以做到这一点,(df1 + df2) / 2

您这里的真正问题是,DataFrame中包含NaN的列是object dtype,而不是浮动数据类型。解决此问题,以上方法将起作用。理想情况下,可以在输入中输入np.nan来解决此问题,或者稍后再强制将列dtypes设置为数字。

df1 = df1.apply(pd.to_numeric, errors='coerce')
df2 = df2.apply(pd.to_numeric, errors='coerce')

答案 1 :(得分:3)

columnstypevar1的{​​{1}}的{​​{1}}是对象,这是因为原始数据是df1是混合类型,并且'NaN'不是df2

[1.2,'NaN', 3.0, 1.0]

答案 2 :(得分:2)

您可以使用NumPy来计算数组的均值。

arr = np.array([df1.replace('NaN', np.nan).values,
                df2.replace('NaN', np.nan).values])

res = pd.DataFrame(arr.mean(0), index=df1.index, columns=df1.columns)

print(res)

         Var1  Var2  Var3
ID                       
Alpha    17.5  1.10   0.5
Bravo     NaN   NaN   0.0
Charlie  17.0  2.50   0.5
Delta    19.0  1.25   1.0 

说明

此解决方案需要执行以下步骤:

  1. 将字符串'NaN'转换为np.nan
  2. 将2个数组合并为一个数组。
  3. 计算axis=0上的均值。
  4. 从输入中构造数据框,馈入索引和列。