Python 熊猫:比较与数据帧之间的平均比率
你好,我有两个比率计算的数据帧。当我这样做的时候,我将每行和每列的平均值取一个平均值,这两个平均值在数据帧中不匹配 df1 df2 为了计算平均值,我使用了下面的代码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['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