我有两个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?
答案 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)
在columns
和type
中var1
的{{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
说明
此解决方案需要执行以下步骤:
'NaN'
转换为np.nan
。axis=0
上的均值。