![](/img/trans.png)
[英]Python groupby - Create a new column based on values in other columns
[英]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
用於替代rank
到NaN
供匹配的行2
的結果,然后使用GroupBy.transform
為每團的重復值GroupBy.first
,最后通過比較更大Series.gt
和設定值6
在DataFrame.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.