我有需要相互排名的字母評級,然后以特定格式提取最低排名和中值評級。除了這些列中的最后一行,我已將最低排名和中值評級轉換為正確的特定格式。有人可以幫我解決為什么我的最后一行似乎沒有轉換為正確的格式嗎?
對于背景關系,我在 csv 末尾使用 3 列創建了一個資料框:
df = pdf.read_csv('csv path', usecols=['rating1','rating2','rating3'])
資料框如下所示:
rating1 rating2 rating3
0 D Dd c
1 C Bb A
2 B Bb b
我創建了一個如下所示的映射字典:
ranking = {
'D': 1, 'Dd': 1, 'd': 1, 'C':2, 'Cc': 2, 'c': 2, 'B': 3, 'Bb': 3, 'b':3, 'A' : 4
}
排名規則是: 1.如果所有評分都相同,則可以拉最低評分;2.如果兩個評分相同,則拉入最低評分;3.如果三個評級不同,過濾掉最大評級和最小評級。因為我需要對它們進行排名并創建兩列來拉最低排名和中等排名,所以當我對它們進行排名時,我需要我的資料框看起來像這樣:
rating1 rating2 rating3 medium_rating minimum_rating
0 D Dd c 1 1
1 C Bb A 3 2
2 B Bb b 3 3
我的最后一步是,一旦我對 medium_rating 和 minimum_rating 進行了排名,我需要將數字排名轉換回 rating1 格式,因此我的資料框最終應該如下所示:
rating1 rating2 rating3 medium_rating minimum_rating
0 D Dd c D D
1 C Bb A B C
2 B Bb b B B
我創建了一個映射字典來將排名轉換為如下所示的 rating1 格式:
rating1_rank = {
1: 'D', 2: 'C', 3: 'B', 4: 'A'
}
當我嘗試將我的中等和最低評分轉換為 rating1_rank 格式時,這些列中的所有行都被轉換,除了最后一個。請參閱下面的代碼:
這是設定資料框列和評級字典:
df = pdf.read_csv('csv path', usecols=['rating1','rating2','rating3'])
ranking = {
'D': 1, 'Dd': 1, 'd': 1, 'C':2, 'Cc': 2, 'c': 2, 'B': 3, 'Bb': 3, 'b':3, 'A' : 4
}
rating1_rank = {
1: 'D', 2: 'C', 3: 'B', 4: 'A'
}
以下是創建中等評分列和最低評分的邏輯:
df['Medium_Rating'] = np.where(df.replace(ranking).nunique(axis=1).isin([1,2]),
df.replace(ranking).min(axis=1),
df.replace(ranking).median(axis=1))
df['Minimum_Rating'] = df.replace(ranking).min(axis=1)
這意味著將中等評級和最低評級元素轉換為 rating1_rank:
df[:-1] = df.replace(rating1_rank)
df[:-2] = df.replace(rating1_rank)
我的結果是:
rating1 rating2 rating3 medium_rating minimum_rating
0 D Dd c D D
1 C Bb A B C
**2 B Bb b 3 3**
為什么最后一行沒有轉換?
uj5u.com熱心網友回復:
在本例中,您可以簡單地使用:
df = df.replace(rating1_rank)
print(df)
rating1 rating2 rating3 Medium_Rating Minimum_Rating
0 D Dd c D D
1 C Bb A B C
2 B Bb b B B
為了避免無意中更改我們不想更改的列的風險(盡管在這里并不真正適用),請僅選擇最后兩列df.iloc:
df.iloc[:, -2:] = df.iloc[:, -2:].replace(rating1_rank)
或與df.loc:
cols = ['Medium_Rating', 'Minimum_Rating']
df.loc[:, cols] = df.loc[:, cols].replace(rating1_rank)
至于為什么您的方法不起作用:我認為您誤解了df[:-1]and的含義df[:-2]。您在此處選擇行。讓我們看一個列印:
print(df[:-1])
rating1 rating2 rating3 Medium_Rating Minimum_Rating
0 D Dd c D D
1 C Bb A B C
所以,在這里你選擇 row 0through to 并包括-1(1在這種情況下,因為我們有 rows 0, 1, 2)。使用df[:-2],沿著相同的路線,您只選擇第一行:行0到并包括0!
進一步了解您可以從和documentation中選擇資料的所有不同方式。dfsSeries
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/525436.html
上一篇:在我的資料框中,我有時間列,我需要將我的HH:MM:SS.SS轉換為秒。我怎么能在python中做到這一點?[復制]
