猿问

熊猫:比较数据帧之间的平均比率

我有两个比率计算数据框。当我这样做时,我正在对每一列的每一行取平均值以获得一个值平均值,因为这两个平均比例在数据帧中不匹配


df1


  name      exm1    exm2    exm3     exm4

  student1  0.43    0.36      0         1

  student2     0       0      0      0.45

  student3     0       0      0         0

  student4  0.64       0   0.75       0.6

  student5  0.12    0.23   0.57         0

  student6     0       0      0       0.9

  student7     0       1      0       0.3

  student8  0.43    0.36      0      0.25

  student9     0       0      0      0.58

 student10     0       0      0         0

df2


    name        exm1    exm2    exm3    exm4

   student1     0.57    0.64       0       0

   student2        0       0       0    0.55

   student3        0       0       0       1

   student4     0.36       0    0.25     0.4

   student5     0.88    0.77    0.43       0

   student6        0       0       0     0.9

   student7        0       0       0     0.3

   student8        0       0       0    0.25

   student9        0       0       0    0.58

   student10       0       0       0       0

计算我在下面的代码中使用的平均值


df1['average'] = df1.mean(numeric_only=True, axis=1)

df2['average'] = df2.mean(numeric_only=True, axis=1)

在两个数据框中,当 comapare average along students average 不等于 1 的主要原因是两个单元格中都存在 0。例如 exm3 中的 student1 都是零,这种类型的零使得平均值不合适


  name     average_df1  average_df2  sum

 student1   0.4475      0.451875    0.899375

 student2   0.1125      0.140625    0.253125

 student3        0          0          0

 student4   0.4975      0.461875    0.959375

 student5   0.23        0.2575      0.4875

 student6   0.225       0.28125     0.50625

 student7   0.325       0.40625     0.73125

 student8   0.26        0.2175      0.4775

 student9   0.145       0.18125     0.32625

 student10     0           0          0

平均值之和应等于一。我怎样才能在熊猫中做到这一点任何建议


德玛西亚99
浏览 109回答 2
2回答

慕码人2483693

您使用零来表示缺失数据,同时它们也可以表示有效值。首先确定缺失值在哪里,例如: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子句以跳过包含字符串值的列。

holdtom

问题的症结在于:.replace全部0都是np.nan,因此它们不会与其他数据框一起计算平均值。但是,这意味着如果其他数据帧中有伴随的 1,则替换 0 会产生不良影响。对于这些,当其他数据帧的同一单元格中存在 1 时,您可以遍历列并应用矢量化np.where以替换NaN值。0代码:import numpy as np, pandas as pddf1 = 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_df20   0.596667    0.403333    1.0000001   0.450000    0.550000    1.0000002   0.000000    1.000000    1.0000003   0.663333    0.336667    1.0000004   0.306667    0.693333    1.0000005   0.900000    0.900000    1.8000006   0.650000    0.150000    0.8000007   0.346667    0.250000    0.5966678   0.580000    0.580000    1.1600009   NaN         NaN         NaN
随时随地看视频慕课网APP

相关分类

Python
我要回答