【问题标题】:Extracting words from a column that are not in list and creating new column从不在列表中的列中提取单词并创建新列
【发布时间】:2020-04-06 09:44:27
【问题描述】:

我想从列中的字符串值中提取特定的子字符串。在下面的代码中,您会看到我已经成功提取了年份、品牌和型号。

import pandas as pd
import numpy as np

data = [['year_make_model'], 
    ['1970 Plymouth Hemi Cuda'], 
    ['1970 Dodge Challenger R/T SE Convertible'], 
    ['1971 Plymouth Cuda']]

data = pd.DataFrame(data[1:], columns=data[0])

def create_year_make_model(df):
    df['year'] = df.year_make_model.str.extract('(\d\d\d\d)', expand=True) 
    df['make'] = np.where(df.year_make_model.str.contains('Plymouth'), 'Plymouth',
                             np.where(df.year_make_model.str.contains('Dodge'), 'Dodge', 'Nan'))
    df['model'] = np.where(df.year_make_model.str.contains('Cuda'), 'Cuda',
                             np.where(df.year_make_model.str.contains('Challenger'), 'Challenger', 'Nan'))
    return df.head()                   

create_year_make_model(data)

                             year_make_model    year        make         model
0   1970 Plymouth Hemi Cuda                     1970    Plymouth          Cuda
1   1970 Dodge Challenger R/T SE Convertible    1970    Dodge       Challenger
2   1971 Plymouth Cuda                          1971    Plymouth          Cuda

现在我需要提取所有剩余的单词(如果有的话)。剩下的词组成了车辆的“类型”(见下面的例子)。

car_type = ['Hemi', 'R/T SE Convertible', None]
data['type'] = car_type
data 

                             year_make_model    year        make         model                   type
0   1970 Plymouth Hemi Cuda                     1970    Plymouth          Cuda                   Hemi
1   1970 Dodge Challenger R/T SE Convertible    1970    Dodge       Challenger     R/T SE Convertible
2   1971 Plymouth Cuda                          1971    Plymouth          Cuda                   None

到目前为止,我已经尝试了许多不同的方法,但都没有运气。我尝试过的一种方法是为全年、品牌和型号组合创建一个列表word_list = ['Cuda','Challenger','1970','1971','Dodge','Plymouth']。然后我做了一个for循环,试图提取列'year_make_model'中不在word_list中的单词,但我无法让它工作。我希望有人知道解决我的问题的技巧,在此先感谢!

【问题讨论】:

    标签: python string pandas list text-extraction


    【解决方案1】:

    我不确定这是否是解决问题的最佳方法,但它似乎确实有效:

    import numpy as np
    import pandas as pd
    
    data = [['year_make_model'], 
        ['1970 Plymouth Hemi Cuda'], 
        ['1970 Dodge Challenger R/T SE Convertible'], 
        ['1971 Plymouth Cuda']]
    
    data = pd.DataFrame(data[1:], columns=data[0])
    
    def create_year_make_model(df):
        cell_text = df.year_make_model.str
    
        df['year'] = cell_text.extract('(\d\d\d\d)', expand=True)
    
        df['make'] = np.where(cell_text.contains('Plymouth'), 'Plymouth',
                               np.where(cell_text.contains('Dodge'), 'Dodge', 'Nan'))
    
        df['model'] = np.where(cell_text.contains('Cuda'), 'Cuda',
                                 np.where(cell_text.contains('Challenger'), 'Challenger', 'Nan'))
    
        # what fields to remove
        rm_fields = ["year", "make", "model"]
    
        for field in rm_fields:
          # remove this field
          for val in getattr(df, field).values:
            cell_text = cell_text.replace(str(val), "").str
    
        # clean any leading/trailing spaces
        cell_text = cell_text.replace(r"^\s+", "")
        cell_text = cell_text.replace(r"\s+$", "")
    
        df['type'] = cell_text
    
        return df.head()    
    
    print(create_year_make_model(data))
    

    因此,在您提取年份、品牌和型号字段后,您可以返回并获取这些字段的提取值并用空格替换它们。

    还应删除任何可能的前导/尾随空格以保持一致性。

    【讨论】:

    • 有效!解决这个问题的非常有创意的方法,谢谢!唯一缺少的是第三行的缺失值。我刚刚检查了data.isnull().values.any() 并没有..
    • 在返回df = df.replace(r'^\s*$', np.nan, regex=True)之前用这一行修复它
    猜你喜欢
    • 2023-01-21
    • 2018-12-27
    • 1970-01-01
    • 2015-11-02
    • 2022-11-30
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多