我有一個資料集,我嘗試僅選擇與串列中定義的字串完全匹配的行。
list = ['P:34.', 'R:ES.']
df = pd.DataFrame({
'Date':['2021-01-01', '2021-01-01', '2021-01-01', '2021-01-02', '2021-01-02', '2021-01-02', '2021-01-02', '2021-01-03'],
'Code':['P:34. R:ES.', 'R:ESB.', 'K2P:P:341.', 'R:ESZ', 'P:34.', 'R.ES7.', 'P 34 5', 'P:32. R:ES.'],
'Ratings':[9.0, 8.0, 5.0, 3.0, 2, 3, 6, 5]})
我使用該函式相應str.contains地選擇行,但是這樣,我得到的行與字串不完全匹配。
sample = df[df.Code.str.contains('|'.join(list),na=False)]
我嘗試僅獲取串列中包含完全字串的行(也考慮字串末尾的點),如下所示:
df_exact_match = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03'],
'Code':['P:34. R:ES.', 'P:34.', 'P:32. R:ES.'],
'Ratings':[9.0, 2, 5]})
非常感謝您的建議:)
uj5u.com熱心網友回復:
您可以稍微調整一下代碼。我將首先拆分“代碼”列,然后isin與 結合使用any(axis=1),這將允許該串列的任何值包含在“代碼”拆分列中,該列分為幾個部分:
l = ['P:34.', 'R:ES.']
df.loc[df['Code'].str.split(expand=True).isin(l).any(1)]
印刷:
Date Code Ratings
0 2021-01-01 P:34. R:ES. 9.0
4 2021-01-02 P:34. 2.0
7 2021-01-03 P:32. R:ES. 5.0
命名您的 custom list, list也不是一個好習慣。最好使用不同的名稱。我還建議不要使用,str.contains因為這會回傳部分匹配,顧名思義,而不是完全匹配。
uj5u.com熱心網友回復:
我得到的行與字串不完全匹配。
發生這種情況是因為默認情況下Series.str.contains假設第一個引數是正則運算式模式,并且在正則運算式中點.匹配任何單個字符。要匹配文字,.您必須對其進行轉義(即\.)。沒有必要指定na=Falsebtw。
>>> l = ['P:34\.', 'R:ES\.']
>>> df[df.Code.str.contains('|'.join(l))]
Date Code Ratings
0 2021-01-01 P:34. R:ES. 9.0
4 2021-01-02 P:34. 2.0
7 2021-01-03 P:32. R:ES. 5.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/333433.html
