Python 3.x 在数据帧中根据条件调整循环内的值

Python 3.x 在数据帧中根据条件调整循环内的值,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我有一个数据框,如下所示 code score ac 2.4 xz 2.6 ui 3.4 zy 1.2 我想调整得分>2.5的得分,多余的得分(即2.6-2.5=0.1)应根据现有得分分配给所有其他得分。这个过程应该一直这样做,直到每次得分都为止。我不知道有什么方法可以做到这一点,只需给出一个复杂的解决方案供参考 import pandas as pd data =

我有一个数据框,如下所示

code    score   
ac       2.4        
xz       2.6         
ui       3.4            
zy       1.2    

我想调整得分>2.5的得分,多余的得分(即2.6-2.5=0.1)应根据现有得分分配给所有其他得分。这个过程应该一直这样做,直到每次得分都为止。我不知道有什么方法可以做到这一点,只需给出一个复杂的解决方案供参考

import pandas as pd

data = {'code': ['ac', 'xz', 'ui', 'zy'], 'score': [2.4, 2.6, 3.4, 1.2]}
df = pd.DataFrame(data)

excess = 0
def fun(it):
    global excess
    excess += it - 2.5
    return 2.5
# stage 1 handling to get total excess value
a = [i if i<=2.5 else fun(i) for i in df['score']]

def fun2(it):
    global excess
    if excess > 0:
        required = 2.5 - it
        if required <= excess:
            excess -= required
            return 2.5
        else:
            return round(it + excess, 2)
    else:
        return it
#stage 2 handling to distribute excess value to others
output = [per_a if per_a==2.5 else fun2(per_a) for per_a in a]

df['score'] = output
print(df)

你能说得更清楚些吗?3.4如何变为2.5,1.2如何变为2.1?@user3280146有2.5的限制,分数不能超过2.5。超出的值3.4-2.5=0.9将被添加到所有其他小于2.5的值中,此过程将一直执行,直到没有值大于2.5。@user3280146我希望现在可以清楚地看到,在调整过程中,值发生了变化。实际上,这在任何情况下都不会发生,因为输入分数是通过所有分数之和=10的过程生成的,在这里设置值时,不需要新的值,因为多余的值应该分配给所有其他值,感谢您的时间和帮助。因为我对python和pandas非常陌生,所以无法完全理解您提供的代码。如果你能告诉我怎样才能做到以下几点,那将更有帮助。psuedo代码:while(循环到分数>2.5的任意一个)。。。。。。。。。。。。在这里,我将把值大于2.5的记录更新为2.5,并将超额分数更新为所有其他还押。请仅在循环语法时告诉我。我会自己做,如果需要,我会再问。你不熟悉
列表理解
,循环语法的
如何?我需要while循环,我在考虑逻辑,我需要while循环在分数列上的条件。我需要你的帮助。你的意思是只要改变
a=[I如果是这样,它会把我打倒,让我给出一个简单的解决方案,我的答案真的很复杂,让我们一起等待更好的答案。
import pandas as pd

data = {'code': ['ac', 'xz', 'ui', 'zy'], 'score': [2.4, 2.6, 3.4, 1.2]}
df = pd.DataFrame(data)

excess = 0
def fun(it):
    global excess
    excess += it - 2.5
    return 2.5
# stage 1 handling to get total excess value
a = [i if i<=2.5 else fun(i) for i in df['score']]

def fun2(it):
    global excess
    if excess > 0:
        required = 2.5 - it
        if required <= excess:
            excess -= required
            return 2.5
        else:
            return round(it + excess, 2)
    else:
        return it
#stage 2 handling to distribute excess value to others
output = [per_a if per_a==2.5 else fun2(per_a) for per_a in a]

df['score'] = output
print(df)
  code  score
0   ac    2.5
1   xz    2.5
2   ui    2.5
3   zy    2.1