首页 > 解决方案 > 如何根据其他列字符串为新列赋值?

问题描述

我有一个国家的贸易数据,列名如下

Index(['TNVED', 'Product_Name', 'Export_Value', 'Import_Value', 'Year',
       'Country', 'Region', 'Total_Export_XLS', 'Total_Import_XLS',
       'Export_Sum', 'Import_Sum', 'Type', 'Nonraw_Type'],

现在,如果 raw_materials 列表中的字符串与 df['TNVED'] 中的字符串相同,我正在尝试用“Raw”填充“Type”列。数据框如下所示:

     TNVED                                       Product_Name  ...  Type  Nonraw_Type
   010190           Лошади, ослы, мулы и лошаки живые прочие  ...                   
   010210  Чистопородный племенной крупный рогатый скот ж...  ...                   
   010511  Куры домашние (callus domesticus) живые массой...  ...                   
   010639                                Прочие хищные птицы  ...                   
   010690                              Прочие животные живые  ...                   
   020110  Мясо крупного рогатого скота, свежее или охлаж...  ...                   
   020322  Свиные окорока, лопатки и отруба из них, необв...  ...                   
   020713  Части тушек и субпродукты домашних кур, свежие...  ...                   
   020714  Части тушек и субпродукты домашних кур, мороженые  ...                   
   021099  Прочие: мясо и пищевые мясные субпродукты : вк...  ...                   
   030351  Рыба мороженная,за искл.рыбн.филе и прочего мя...  ...                   
   030379  Прочая рыба за исключением печени, икры и моло...  ...                   
   030530  Рыбное филе, сушеное, соленое или в рассоле, н...  ...                   
   030559  Прочая рыба сушеная, несоленая, или соленая, н...  ...                   
   030749                       Прочие каракатицы и кальмары  ...                   
   040221  Молоко и сливки сгущенные с содержанием жира б...  ...                   
   040221  Молоко и сливки сгущенные с содержанием жира б...  ...                   
   040299  Прочее молоко и сливки сгущенные с добавлением...  ...                   
   040299  Прочее молоко и сливки сгущенные с добавлением...  ...                   
   040510                                    Сливочное масло  ...                   
   040520                                     Молочные пасты  ...                   
   040630           Плавленные сыры, нетертые и не в порошке  ...                   
   040690                                        Прочие сыры  ...                   
   050400  Кишки, пузыри и желудки животных (кроме рыбьих...  ...                   
   050800  Кораллы и аналог.мат-лы,необработ.или первич.о...  ...                   
   051110                                       Сперма бычья  ...                   
   070320                      Чеснок свежий или охлажденный  ...                   
   071010  Картофель сырой или вареный в воде или на пару...  ...                   
   071022  Фасоль (vigna spp., pнaseolus spp.), в стручка...  ...                   
   071029  Прочие бобовые овощи в стручках или очищенные,...  ...                   

[30 rows x 13 columns]

并列出

raw_materials = [010190, 071029, 04, 05, etc] #strings

TNVED 列包含 str 值。我想如果字符串值等于列表中的字符串值,则“类型”列应采用“原始”,否则必须为空。此外,如您所见,列表包含两个值,其中字符串的长度为 2,在这种情况下,所有以这些字符串开头的字符串值都必须更改。最后根据我期望的给定数据框:

     TNVED                                       Product_Name  ...  Type  Nonraw_Type
  010190           Лошади, ослы, мулы и лошаки живые прочие  ...  Raw                 
  010210  Чистопородный племенной крупный рогатый скот ж...  ...                   
  010511  Куры домашние (callus domesticus) живые массой...  ...                   
  010639                                Прочие хищные птицы  ...                   
  010690                              Прочие животные живые  ...                   
  020110  Мясо крупного рогатого скота, свежее или охлаж...  ...                   
  020322  Свиные окорока, лопатки и отруба из них, необв...  ...                   
  020713  Части тушек и субпродукты домашних кур, свежие...  ...                   
  020714  Части тушек и субпродукты домашних кур, мороженые  ...                   
  021099  Прочие: мясо и пищевые мясные субпродукты : вк...  ...                   
  030351  Рыба мороженная,за искл.рыбн.филе и прочего мя...  ...                   
  030379  Прочая рыба за исключением печени, икры и моло...  ...                   
  030530  Рыбное филе, сушеное, соленое или в рассоле, н...  ...                   
  030559  Прочая рыба сушеная, несоленая, или соленая, н...  ...                   
  030749                       Прочие каракатицы и кальмары  ...                   
  040221  Молоко и сливки сгущенные с содержанием жира б...  ...  Raw                 
  040221  Молоко и сливки сгущенные с содержанием жира б...  ...  Raw                 
  040299  Прочее молоко и сливки сгущенные с добавлением...  ...  Raw                 
  040299  Прочее молоко и сливки сгущенные с добавлением...  ...  Raw                 
  040510                                    Сливочное масло  ...  Raw                 
  040520                                     Молочные пасты  ...  Raw                 
  040630           Плавленные сыры, нетертые и не в порошке  ...  Raw                 
  040690                                        Прочие сыры  ...  Raw                 
  050400  Кишки, пузыри и желудки животных (кроме рыбьих...  ...  Raw                 
  050800  Кораллы и аналог.мат-лы,необработ.или первич.о...  ...  Raw                 
  051110                                       Сперма бычья  ...  Raw                 
  070320                      Чеснок свежий или охлажденный  ...                   
  071010  Картофель сырой или вареный в воде или на пару...  ...                   
  071022  Фасоль (vigna spp., pнaseolus spp.), в стручка...  ...                   
  071029  Прочие бобовые овощи в стручках или очищенные,...  ...  Raw                  

我努力了

lens = len(raw_materials)-1

while(0<=lens):
    str_len = len(raw_materials[lens])
    print(str_len)
    df['Type'] = np.where(df['TNVED'] == raw_materials[lens], 'Raw', '')
    lens -= 1`

标签: python-3.xpandas

解决方案


使用Series.str.contains与正则表达式模式一起创建布尔掩码,然后Type使用此掩码替换列中的值:

pattern = r'^(?:' + '|'.join(raw_materials) + ')'
m = df['TNVED'].str.contains(pattern)
df.loc[m, 'Type'] = 'Raw'

您可以测试正则表达式模式here


推荐阅读