[英]pandas: changing values according to conditions within group
我想弄清楚如何調整與 pandas 在同一組內的某些值。
在下面的 df 中,我有兩組(111、222); 在組內,'freq' 被排名。 但是,我想調整組內具有相同“頻率”的“等級”以具有相同的“等級”(升序)。
例子:group:111,freq 1相同,排在第5和第6位; 但是,我想將它們調整到相同的等級(顯示在 adj_rank 列中)
+-----+------+------+----------+ | id | freq | rank | adj_rank | +-----+------+------+----------+ | 111 | 1 | 5 | 5 | | 111 | 1 | 6 | 5 | | 111 | 2 | 1 | 1 | | 111 | 3 | 2 | 2 | | 111 | 4 | 3 | 3 | | 111 | 5 | 4 | 4 | | 222 | 1 | 2 | 2 | | 222 | 2 | 1 | 1 | | 222 | 3 | 4 | 4 | | 222 | 3 | 5 | 4 | | 222 | 4 | 3 | 3 | | 222 | 5 | 6 | 6 | +-----+------+------+----------+
df的代碼
import pandas as pd
import numpy as np
data = {'id':[111,111,111,111,111,111,
222,222,222,222,222,222],
'freq':[1,1,2,3,4,5,
1,2,3,3,4,5],
'rank':[5,6,1,2,3,4,
2,1,4,5,3,6],
'adj_rank':[5,5,1,2,3,4,
2,1,4,4,3,6]}
df = pd.DataFrame(data)
謝謝@Anurag Dabas 的建議,但是,當我擴展 df 時,使用您提供的解決方案時結果將關閉。 如果你看下面的df,當使用你提供的代碼時,adj_rank(第一行)顯示11,然而,正確的值應該是4。請指教,謝謝。 擴展 df:
╔═════╦══════╦══════╦══════════╗ ║ id ║ freq ║ rank ║ adj_rank ║ ╠═════╬══════╬══════╬══════════╣ ║ 333 ║ 1 ║ 11 ║ 11 ║ ║ 333 ║ 2 ║ 1 ║ 1 ║ ║ 333 ║ 2 ║ 2 ║ 1 ║ ║ 333 ║ 1 ║ 5 ║ 4 ║ ║ 333 ║ 1 ║ 6 ║ 4 ║ ║ 333 ║ 1 ║ 7 ║ 4 ║ ║ 333 ║ 1 ║ 8 ║ 4 ║ ║ 333 ║ 1 ║ 9 ║ 4 ║ ║ 333 ║ 3 ║ 3 ║ 3 ║ ║ 333 ║ 3 ║ 4 ║ 3 ║ ║ 333 ║ 1 ║ 10 ║ 4 ║ ╚═════╩══════╩══════╩══════════╝
擴展 df 代碼:
data = {'id':[333,333,333,333,333,333,
333,333,333,333,333],
'freq':[1,2,2,1,1,1,
1,1,3,3,1],
'rank':[11,1,2,5,6,7,8,
9,3,4,10,]}
df = pd.DataFrame(data)
非常感謝 問候
嘗試將['id','freq']
的累積計數減去原始排名:
df['adj_rank']=df['rank']-df.groupby(['id','freq']).cumcount()
#df['adj_rank']=df['rank'].sub(df.groupby(['id','freq']).cumcount())
output 的df
:
id freq rank adj_rank
0 111 1 5 5
1 111 1 6 5
2 111 2 1 1
3 111 3 2 2
4 111 4 3 3
5 111 5 4 4
6 222 1 2 2
7 222 2 1 1
8 222 3 4 4
9 222 3 5 4
10 222 4 3 3
11 222 5 6 6
更新:
在對cumcount()
進行子化之后,使用sort_values()
對 dataframe 的值進行排序,然后使用 groupby ['id','freq']
然后轉換排名的第一個值,最后對 df 的index
進行排序,使其進入初始 position:
df['rank']=df['rank']-df.groupby(['id','freq']).cumcount()
df=df.sort_values(['id','freq','rank'])
df['rank']=df.groupby(['id','freq'],sort=False)['rank'].transform('first')
df=df.sort_index()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.