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

Python 熊猫:比较与数据帧之间的平均比率,python,pandas,dataframe,Python,Pandas,Dataframe,你好,我有两个比率计算的数据帧。当我这样做的时候,我将每行和每列的平均值取一个平均值,这两个平均值在数据帧中不匹配 df1 df2 为了计算平均值,我使用了下面的代码 df1['average'] = df1.mean(numeric_only=True, axis=1) df2['average'] = df2.mean(numeric_only=True, axis=1) 在两个数据帧中,当comapare average沿学生平均数不等于1时,导致此情况的主要原因是两个单元格中都存在0。

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

df1

df2

为了计算平均值,我使用了下面的代码

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

平均数之和应等于一。如何在任何建议中执行此操作

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

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

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://code>或
numeric\u only=True等不完整的子句来跳过包含字符串值的列。

问题的关键在于:

  • 。将所有
    0
    替换为
    np.nan
    ,因此它们不会与其他数据帧一起计算平均值
  • 但是,这意味着如果在另一个数据帧中有一个伴随的1,则会出现替换0的不希望出现的效果。对于这些,当另一个数据帧的同一单元格中存在1时,您可以在列中循环并应用向量化的
    np.where
    NaN
    值替换为
    0
  • 代码:

    输出(前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
    

    你能复制并粘贴数据而不是图像吗?请看:@David Erickson好的……谢谢,如果不读入数据并编写代码,我提供了一个很难提供的答案!
    df1 = df1.set_index['name']
    df2 = df2.set_index['name']
    
    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
    
        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