簡體   English   中英

pandas:組內根據條件改變數值

[英]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.

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