当循环以预定的平均值停止时

2024-06-02 09:12:22 发布

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

Python新手!我有一个简单的数据框,用于将测验分数制成表格:

df = pd.DataFrame({'Sam':[20,20,20,20,20], 'Jim': [20,20,20,20,15], 
'Stacy': [20,20,20,20,30], 'Leslie': [20,20,20,20,20], 'Jonathan': 
[20,20,20,20,15]})

现在,我想写一些东西,改变每一列的顶值(从0开始),直到它对应的平均值等于预先确定的值,然后移到下一列。在得到想要的结果之前,添加一个新行并手工完成这项工作非常简单(如下所示)。然而,我正在寻找一些东西,使程序做迭代,我不得不在iloc字段,以获得'平均2'值,这是预先确定的。我想这可能需要某种while循环,但无法理解语法。代码下面的最终预期结果截图。谢谢您!你知道吗

df.loc['mean1'] = df.mean()
df.iloc[0:1,0:5] = 17, 17, 22, 22, 22
df.loc['mean2'] = df.iloc[:5,:].mean()
df

所需最终数据帧的屏幕截图。


Tags: 数据dataframedfsammeanloc表格pd
1条回答
网友
1楼 · 发布于 2024-06-02 09:12:22

如果我错了,请纠正我,但如果我重新表述了您的问题:
你想要的是为每个参与者(列)找到第一个测验分数的值(测向位置[0]),这将确保参与者获得平均目标分数(mean2)?你知道吗

如果是这样的话,你可以这样做:

# a function that estimate the quiz value to have for obtaining mean score target
def estimate_replace(quiz_id, mean_target, participant_series):
    data = participant_series.loc[participant_series.index != quiz_id].values
    participant_series['mean1'] = participant_series.mean()
    participant_series['mean2'] = mean_target

    # Here is the key function!
    participant_series.loc[quiz_id] = mean_target*(len(data)+1) - data.sum()
    return participant_series

#mean2 : mean scores target per participant
mean_score_target = {'Jim':18.4,
                     'Jonathan':18.4,
                     'Leslie':20.4,
                     'Sam':20.4,
                     'Stacy':22.4}

#the quiz id to replace, 0 in your case
quiz_id = 0

df = df.apply(lambda x: estimate_replace(quiz_id,mean_score_target[x.name],x))

请注意,此代码将与任意数量的测验值(行)一起使用,并且您可以指定要估计/替换的测验值(quiz_id)。你知道吗

然后您将得到以下输出:

       Jim     Jonathan Leslie Sam   Stacy
0      17.0      17.0    22.0  22.0   22.0
1      20.0      20.0    20.0  20.0   20.0
2      20.0      20.0    20.0  20.0   20.0
3      20.0      20.0    20.0  20.0   20.0
4      15.0      15.0    20.0  20.0   30.0
mean1  19.0      19.0    20.0  20.0   22.0
mean2  18.4      18.4    20.4  20.4   22.4

相关问题 更多 >