猿问

Python groupby - 根据其他列中的条件更改列值

我想首先对“组”列进行分组。然后根据结果列和排名列中的条件更改结果列中的值。


这就是我现在所拥有的:


import pandas as pd

import numpy as np


group = ['g1','g1','g1','g1','g1','g2','g2','g2','g2','g2','g2']

rank = ['1','2','3','4','5','1','2','3','4','5','6']

result = ['1','4','2','4','4','1','4','4','2','4','4']


df = pd.DataFrame({"group": group, "rank": rank, "result": result})


    group   rank    result

0   g1        1       1

1   g1        2       4

2   g1        3       2

3   g1        4       4

4   g1        5       4

5   g2        1       1

6   g2        2       4

7   g2        3       4

8   g2        4       2

9   g2        5       4

10  g2        6       4


在同一组中,当排名大于结果 = 2 的排名时,我想将结果从 4 更改为 6

例如:在 g1 中,结果 = 2 的排名是 3。因此排名 4 和 5 的结果将是 6。

在 g2 中,result = 2 的排名是 4。因此排名 5 和 6 的结果将是 6。


在这种情况下,我想要的输出将是:


    group   rank    result

0   g1        1       1

1   g1        2       4

2   g1        3       2

3   g1        4       6

4   g1        5       6

5   g2        1       1

6   g2        2       4

7   g2        3       4

8   g2        4       2

9   g2        5       6

10  g2        6       6


我不知道实现这一目标的最佳方法。有人可以帮忙吗?


陪伴而非守候
浏览 155回答 2
2回答

眼眸繁星

用于Series.where替换结果中与 byrank匹配NaN的行2,然后用于GroupBy.transform每组重复值 by GroupBy.first,最后比较更大的 by并在 中Series.gt设置值:6DataFrame.loc#convert to integers for correct compare values greater like '10'df[['rank','result']] = df[['rank','result']].astype(int)s = df['rank'].where(df['result'].eq(2)).groupby(df['group']).transform('first')df.loc[df['rank'].gt(s), 'result'] = 6print (df)   group  rank  result0     g1     1       11     g1     2       42     g1     3       23     g1     4       64     g1     5       65     g2     1       16     g2     2       47     g2     3       48     g2     4       29     g2     5       610    g2     6       6

莫回无

这就能解决问题import pandas as pdimport numpy as npgroup = ['g1','g1','g1','g1','g1','g2','g2','g2','g2','g2','g2']rank = ['1','2','3','4','5','1','2','3','4','5','6']result = ['1','4','2','4','4','1','4','4','2','4','4']df = pd.DataFrame({"group": group, "rank": rank, "result": result})def changeDf(x):    df_gp = df[df['group'] == x['group']]    rank_of_2 = df_gp.loc[df_gp['result'] =='2', 'rank'].values[0]    if int(x['rank']) > int(rank_of_2):        return '6'    else:        return x['result']df['result'] = df.apply(changeDf, axis=1)print(df)
随时随地看视频慕课网APP

相关分类

Python
我要回答