我有這個燒瓶 API,用戶可以在其中使用他們輸入的名稱執行 get 請求。問題是,我希望能夠在兩個不同的列中搜索該名稱,但我不知道該怎么做,因為這不起作用,因為flask 說“無法使用多維鍵建立索引”:
data = self.data.loc[self.data[['name-english','name_greek']] == name_cap].to_dict()
這是我要說的部分:
class Search(Resource):
def __init__(self):
self.data = pd.read_csv('datacsv')
def get(self, name):
name_cap = name.capitalize()
data = self.data.loc[self.data['name-english'] == name_cap].to_dict()
# return data found in csv
return jsonify({'message': data})
所以我想在這兩列中搜索而不是只搜索一列。
uj5u.com熱心網友回復:
似乎您的 pandasDataframe 語法有問題,而不是 Flask 本身。您可能從 Pandas 收到此錯誤:
ValueError:無法使用多維鍵索引
根據熊貓檔案:
.loc[] 主要基于標簽,但也可以與布爾陣列一起使用。
允許的輸入是:
單個標簽,例如 5 或“a”(請注意,5 被解釋為索引的標簽,而不是沿索引的整數位置)。
標簽串列或陣列,例如 ['a', 'b', 'c']。
帶有標簽的切片物件,例如 'a':'f'。
與被切片的軸長度相同的布爾陣列,例如 [True, False, True]。
一個可對齊的布爾系列。鍵的索引將在屏蔽之前對齊。
一個可對齊的索引。回傳選擇的索引將是輸入。
一個可呼叫函式,帶有一個引數(呼叫 Series 或 DataFrame)并回傳用于索引的有效輸出(上述之一)
在您的示例中,您將self.data[['name-english','name_greek']] == name_cap作為引數提供給 loc,這將回傳另一個資料幀,而不是 True 和 False 陣列或布爾系列。
要根據多列過濾資料框,您可以使用按位運算子(例如 & 和 |):
df.loc[(df["A"] == 1) | (df["B"] == 1)]
或者使用實作的方法isin():
DataFrame 中的每個元素是否包含在值中。
回傳: 布林值的 DataFrame DataFrame 顯示 DataFrame 中的每個元素是否包含在值中。
與any():
回傳是否有任何元素為 True,可能在軸上。
回傳:Series 或DataFrame 如果指定level,則回傳DataFrame;否則,回傳系列。
這樣你就可以將布爾系列作為引數傳遞給 .loc,例如:
df.loc[ df.isin([1]).any(1)]
此外,總是對我處理資料幀有很大幫助的事情是首先使用 jupyter 來測驗某些東西,我認為它更快,而且您可以在資料幀中亂七八糟,以發現做您需要的新方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/380531.html
