亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號