2 回答

TA贡献1860条经验 获得超9个赞
您使用零来表示缺失数据,同时它们也可以表示有效值。
首先确定缺失值在哪里,例如:
missing = (df1==0) & (df2==0)
然后计算你的平均值:
df1['average'] = df1[~missing].iloc[:, 1:].mean(axis=1) df2['average'] = df2[~missing].iloc[:, 1:].mean(axis=1)
您应该使用第一列作为索引:
df1 = df1.set_index['name'] df2 = df2.set_index['name']
这样会更简洁,并且您可以避免诸如loc[:, 1:]
or之类的不完整numeric_only=True
子句以跳过包含字符串值的列。

TA贡献1805条经验 获得超10个赞
问题的症结在于:
.replace
全部0
都是np.nan
,因此它们不会与其他数据框一起计算平均值。但是,这意味着如果其他数据帧中有伴随的 1,则替换 0 会产生不良影响。对于这些,当其他数据帧的同一单元格中存在 1 时,您可以遍历列并应用矢量化
np.where
以替换NaN
值。0
代码:
import numpy as np, pandas as pd
df1 = df1.replace(0,np.nan)
df2 = df2.replace(0,np.nan)
for col in df1.columns:
df2[col] = np.where(df1[col] == 1, df2[col].replace(np.nan,0), df2[col])
df1[col] = np.where(df2[col] == 1, df1[col].replace(np.nan,0), df1[col])
df = (df1.assign(average_df1=df1.mean(axis=1),
average_df2=df2.mean(axis=1),
sum_df1_df2=df1.mean(axis=1)+df2.mean(axis=1))
.iloc[:,-3:])
df
输出(前 5 行按预期加起来为 1——我不确定你输入的最后 5 行中的数据是否有误,但没有办法让它们加起来为 1:
average_df1 average_df2 sum_df1_df2
0 0.596667 0.403333 1.000000
1 0.450000 0.550000 1.000000
2 0.000000 1.000000 1.000000
3 0.663333 0.336667 1.000000
4 0.306667 0.693333 1.000000
5 0.900000 0.900000 1.800000
6 0.650000 0.150000 0.800000
7 0.346667 0.250000 0.596667
8 0.580000 0.580000 1.160000
9 NaN NaN NaN
添加回答
举报