为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

德玛西亚99 2023-03-30 10:42:08
我有两个比率计算数据框。当我这样做时,我正在对每一列的每一行取平均值以获得一个值平均值,因为这两个平均比例在数据帧中不匹配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         0df2    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平均值之和应等于一。我怎样才能在熊猫中做到这一点任何建议
查看完整描述

2 回答

?
慕码人2483693

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子句以跳过包含字符串值的列。


查看完整回答
反对 回复 2023-03-30
?
holdtom

TA贡献1805条经验 获得超10个赞

问题的症结在于:

  1. .replace全部0都是np.nan,因此它们不会与其他数据框一起计算平均值。

  2. 但是,这意味着如果其他数据帧中有伴随的 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


查看完整回答
反对 回复 2023-03-30
  • 2 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信