簡體   English   中英

Python groupby - 根據其他列中的條件更改列值

[英]Python groupby - change column values based on conditions in other columns

我想先對“組”列進行分組。 然后根據結果列和排名列中的條件更改結果列中的值。

這就是我現在所擁有的:

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 中,result = 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

我不知道實現這一目標的最佳方法。 任何人都可以幫忙嗎?

提前致謝!

使用Series.where用於替代rankNaN供匹配的行2的結果,然后使用GroupBy.transform為每團的重復值GroupBy.first ,最后通過比較更大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

這將解決問題

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM