Pandas:比较与数据帧之间的平均比率

2024-09-28 23:39:10 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我有两个比率计算的数据帧。当我这样做的时候,我将每行和每列的平均值取一个平均值,这两个平均值在数据帧中不匹配

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沿学生平均数不等于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

平均数之和应等于一。我怎样才能做到呢?有什么建议吗


Tags: 数据name平均值df1df2averagestudent1student2
2条回答

您正在使用零来表示缺少的数据,同时它们也可以表示有效值

首先确定缺失值的位置,例如:

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:]numeric_only=True之类的不完整子句来跳过包含字符串值的列

问题的关键在于:

  1. .replace所有{}与np.nan一起,因此它们不会与其他数据帧一起计算平均值
  2. 但是,这意味着如果在另一个数据帧中有一个伴随的1,则会出现替换0的不希望出现的效果。对于这些,当另一个数据帧的同一单元格中存在1时,您可以在列中循环并应用向量化的np.whereNaN值替换为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

相关问题 更多 >