我正在嘗試過濾我的資料框,以便當我創建一個新的列輸出時,它會顯示“中等”評級。我的資料框有 str 值,所以我根據我擁有的排名系統將它們轉換為數字,然后過濾掉每行的最大和最小評級。
我遇到了這個錯誤:
TypeError: unsupported operand type(s) for &: 'str' and 'bool'
我創建了一個從我的 csv 檔案中提取 str 值的資料框:
df = pdf.read_csv('csv path', usecols=['rating1','rating2','rating3'])
我的資料框如下所示:
rating1 rating2 rating3
0 D D C
1 C B A
2 B B B
我需要它看起來像這樣
rating1 rating2 rating3 mediumrating
0 D D C 1
1 C B A 3
2 B B B 3
我有一個將值轉換為數字的映射字典。
ranking = {
'D': 1, 'C':2, 'B': 3, 'A' : 4
}
您可以在下面找到我用來確定“中等評級”的代碼。基本上,如果所有評分都相同,則可以拉最低評分。如果兩個評級相同,則拉入最低評級。如果三個評級不同,則過濾掉最高評級和最低評級。
if df == df.loc[(['rating1'] == df['rating2'] & df['rating1'] == df['rating3'])]:
df['mediumrating'] = df.replace(ranking).min(axis=1)
elif df == df.loc[(['rating1'] == df['rating2'] | df['rating1'] == df['rating3'] | df['rating2'] == df['rating3'])]:
df['mediumrating'] = df.replace(ranking).min(axis=1)
else:
df['mediumrating'] == df.loc[(df.replace(ranking) > df.replace(ranking).min(axis=1) & df.replace(ranking)
歡迎對我的格式或程序提供任何幫助!
uj5u.com熱心網友回復:
使用np.where
:
- 對于
condition
,使用df.nunique
應用于axis=1
并檢查結果是否等于1
(所有值都相同)或2
(兩個不同的值)Series.isin
。 - 如果
True
,我們需要df.min
一起axis=1
。 - 如果
False
(所有唯一值),我們需要df.median
沿著axis=1
. - 最后,使用
astype
將結果floats
變成integers
。
import pandas as pd
import numpy as np
data = {'rating1': {0: 'D', 1: 'C', 2: 'B'},
'rating2': {0: 'D', 1: 'B', 2: 'B'},
'rating3': {0: 'C', 1: 'A', 2: 'B'}}
df = pd.DataFrame(data)
ranking = {'D': 1, 'C':2, 'B': 3, 'A' : 4}
df['mediumrating'] = np.where(df.replace(ranking).nunique(axis=1).isin([1,2]),
df.replace(ranking).min(axis=1),
df.replace(ranking).median(axis=1)).astype(int)
print(df)
rating1 rating2 rating3 mediumrating
0 D D C 1
1 C B A 3
2 B B B 3
uj5u.com熱心網友回復:
花了幾秒鐘來理解過濾器的真正含義。這里有一些代碼應該是不言自明的,并且應該實作您正在尋找的內容:
# Import pandas library
import pandas as pd
# initialize list of lists
data = [['D', 'D', 'C'], ['C', 'B', 'A'], ['B', 'B', 'B']]
# Create the pandas DataFrame
df = pd.DataFrame(data, columns=['rating1', 'rating2', 'rating3'])
# dictionary that maps the rating to a number
rating_map = {'D': 1, 'C': 2, 'B': 3, 'A': 4}
def rating_to_number(rating1, rating2, rating3):
if rating1 == rating2 and rating2 == rating3:
return rating_map[rating1]
elif rating1 == rating2 or rating1 == rating3 or rating2 == rating3:
return min(rating_map[rating1], rating_map[rating2], rating_map[rating3])
else:
return rating_map[sorted([rating1, rating2, rating3])[1]]
# create a new column based on the values of the other columns such that the new column has the value of therating_to_number function applied to the other columns
df['mediumrating'] = df.apply(lambda x: rating_to_number(x['rating1'], x['rating2'], x['rating3']), axis=1)
print(df)
這列印出來:
rating1 rating2 rating3 mediumrating
0 D D C 2
1 C B A 3
2 B B B 3
編輯:根據您更新的問題更新 rating_to_number
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/525446.html
上一篇:如何計算列的重復不變符號?
下一篇:替換不同列中的重復值