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

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

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

陪伴而非守候 2023-11-09 22:06:25
我想首先对“组”列进行分组。然后根据结果列和排名列中的条件更改结果列中的值。这就是我现在所拥有的: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})    group   rank    result0   g1        1       11   g1        2       42   g1        3       23   g1        4       44   g1        5       45   g2        1       16   g2        2       47   g2        3       48   g2        4       29   g2        5       410  g2        6       4在同一组中,当排名大于结果 = 2 的排名时,我想将结果从 4 更改为 6例如:在 g1 中,结果 = 2 的排名是 3。因此排名 4 和 5 的结果将是 6。在 g2 中,result = 2 的排名是 4。因此排名 5 和 6 的结果将是 6。在这种情况下,我想要的输出将是:    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我不知道实现这一目标的最佳方法。有人可以帮忙吗?
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

用于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'] = 6

print (df)

   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


查看完整回答
反对 回复 2023-11-09
?
莫回无

TA贡献1865条经验 获得超7个赞

这就能解决问题


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})


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)


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

添加回答

举报

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