簡體   English   中英

pandas.Series.str.replace()基於另一個系列

[英]pandas.Series.str.replace() based on another series

我正在使用DataQuest指導項目( https://www.dataquest.io/m/294/guided-project%3A-exploring-ebay-car-sales-data/ )中提供的二手車數據集。 我提供了此問題的數據樣本。

我要做的是從汽車名稱中刪除多余的信息,例如品牌名稱。 品牌已經包含在數據的另一列中,並且此練習正在使用熊貓進行數據清理,因此,我想看看是否存在使用庫功能替換此類子字符串的干凈方法。 我試圖傳遞一個熊貓系列作為pat在參數Series.str.replace()但顯然它不會工作。 在基於另一個系列的熊貓系列上執行矢量化替換的干凈方法是什么?

理想情況下, 'Peugeot_807_160_NAVTECH_ON_BOARD'將變為'_807_160_NAVTECH_ON_BOARD' ,依此類推。

import pandas as pd

autos_dict = {
    'brand': ['peugeot', 'bmw', 'volkswagen', 'smart', 'chrysler'],
    'name': [
        'Peugeot_807_160_NAVTECH_ON_BOARD',
        'BMW_740i_4_4_Liter_HAMANN_UMBAU_Mega_Optik',
        'Volkswagen_Golf_1.6_United',
        'Smart_smart_fortwo_coupe_softouch/F1/Klima/Panorama',
        'Chrysler_Grand_Voyager_2.8_CRD_Aut.Limited_Stow´n_Go_Sitze_7Sitze'
    ]
}

autos_df = pd.DataFrame.from_dict(autos_dict)
autos_df['name'].str.replace(autos_df['brand'], '', case=False)

返回以下錯誤信息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/anaconda3/lib/python3.6/site-packages/pandas/core/strings.py", line 2429, in replace
    flags=flags, regex=regex)
  File "/anaconda3/lib/python3.6/site-packages/pandas/core/strings.py", line 656, in str_replace
    compiled = re.compile(pat, flags=flags)
  File "/anaconda3/lib/python3.6/re.py", line 233, in compile
    return _compile(pattern, flags)
  File "/anaconda3/lib/python3.6/re.py", line 289, in _compile
    p, loc = _cache[type(pattern), pattern, flags]
  File "/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py", line 1489, in __hash__
    ' hashed'.format(self.__class__.__name__))
TypeError: 'Series' objects are mutable, thus they cannot be hashed

我可以使用原始Python進行此操作,因此,僅當您具有基於Pandas的解決方案時,請做出回應。

您可以使用apply函數來做到這一點:

In [6]: def replace_brand(row):
   ...:     return row['name'].lower().replace(row['brand'], '')
   ...: 

In [8]: autos_df['name'] = autos_df.apply(lambda row: replace_brand(row), axis=1)

In [9]: autos_df
Out[9]: 
        brand                                               name
0     peugeot                          _807_160_navtech_on_board
1         bmw            _740i_4_4_liter_hamann_umbau_mega_optik
2  volkswagen                                   _golf_1.6_united
3       smart          __fortwo_coupe_softouch/f1/klima/panorama
4    chrysler  _grand_voyager_2.8_crd_aut.limited_stow´n_go_s...

apply

r = {v: '' for _, v in df.brand.to_dict().items()}
df.name.str.lower().replace(r, regex=True)

輸出

0                            _807_160_navtech_on_board
1              _740i_4_4_liter_hamann_umbau_mega_optik
2                                     _golf_1.6_united
3            __fortwo_coupe_softouch/f1/klima/panorama
4    _grand_voyager_2.8_crd_aut.limited_stow´n_go_s...
Name: name, dtype: object

您只需要使用忽略re.I的正則表達式即可,即(?i)re.I相同。 由於df.replace不帶標志參數,因此您將手動調用此參數。 這樣可以確保所有其他字符都保持刪除前的狀態。 即,如果它們是資本,它們將保持不變,反之亦然

autos_df.name.replace(regex=r'(?i)'+ autos_df.brand,value="")
Out[1726]: 
0                            _807_160_NAVTECH_ON_BOARD
1              _740i_4_4_Liter_HAMANN_UMBAU_Mega_Optik
2                                     _Golf_1.6_United
3            __fortwo_coupe_softouch/F1/Klima/Panorama
4    _Grand_Voyager_2.8_CRD_Aut.Limited_Stow´n_Go_S...
Name: name, dtype: object

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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