首页 > 解决方案 > 如何用一个函数替换字符串数据框中的多个字符

问题描述

我试图用“”替换字符串中的一些字符。我正在尝试使用 lambda 函数来丢弃我不需要的字符串中的字符。请帮我解决这个问题。

我的样本是:

import pandas as pd
    df = pd.DataFrame({"Goods" :['Chicken eggs','Cowmilk)','Candy-go','Bread','Butter']})
print(df)

Goods
0  Chicken eggs
1      Cowmilk)
2      Candy-go
3         Bread
4        Butter

使用一个 lambda 替换器,它毫无疑问地工作。

def replacer():
    df = pd.DataFrame({"Goods" :['Chicken eggs','Cowmilk)','Candy-go','Bread','Butter']})
    
    replacer1 = lambda x: x.replace(" ", "")
    df = df['Goods'].apply(replacer1)
    
    
    return df

replacer()
0    Chickeneggs
1      Cow(milk)
2       Candy-go
3          Bread
4         Butter
Name: Goods, dtype: object

但是当我想用几个 lambda 替换器替换时,它给了我一个错误:

def replacer():
    df = pd.DataFrame({"Goods" :['Chicken eggs','Cowmilk)','Candy-go','Bread','Butter']})
    
    replacer1 = lambda x: x.replace(" ", "")
    replacer2 = lambda x: x.replace(")", "")
    replacer3 = lambda x: x.replace("-", "")
    
    df = df['Goods'].apply(replacer1)
    df = df['Goods'].apply(replacer2)
    df = df['Goods'].apply(replacer3)
    
    return df

replacer()

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-20-b64a731a1bae> in <module>
----> 1 replacer()

<ipython-input-19-d57b1f0a5d24> in replacer()
      7 
      8     df = df['Goods'].apply(replacer2)
----> 9     df = df['Goods'].apply(replacer3)
     10     df = df['Goods'].apply(replacer1)
     11 

~\anaconda3\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
    869         key = com.apply_if_callable(key, self)
    870         try:
--> 871             result = self.index.get_value(self, key)
    872 
    873             if not is_scalar(result):

~\anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
   4403         k = self._convert_scalar_indexer(k, kind="getitem")
   4404         try:
-> 4405             return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
   4406         except KeyError as e1:
   4407             if len(self) > 0 and (self.holds_integer() or self.is_boolean()):

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index_class_helper.pxi in pandas._libs.index.Int64Engine._check_type()

KeyError: 'Goods'

我想要得到的是:

 Goods
0  Chickeneggs
1      Cowmilk
2      Candygo
3        Bread
4       Butter

标签: python

解决方案


问题是这样的——

df = df['Goods'].apply(replacer1)

df['Goods'].apply(replacer1)replacer 返回一个 pandas Series 并将其分配给df下一次调用replacer2它时尝试将其应用于一个 series 并且一个 series 没有 column Goods。解决办法是——

df['Goods'] = df['Goods'].apply(replacer1)

推荐阅读