簡體   English   中英

熊貓使用列表中的值替換字符串

[英]Pandas replace string using values from list

我正在嘗試在dataframe(df)內的一列中替換字符串。 df的外觀如下:

                           0                  1
0  2012 Black Toyota Corolla    White/Black/Red
1      2013 Red Toyota Camry    Red
2      2015 Blue Honda Civic    Blue
3         2012 Black Mazda 6    Black/Red/White
4   2011 White Nissan Maxima    White/Red/Black

有時,列1具有多個顏色值,有時只有一個值。 我想獲取第1列中有多少個值,請檢查第0列中是否存在任何值,然后從第0列中刪除該值。

我嘗試過這種方式。

    def removeColor(main,sub):
         for i in sub.split('/'):
                 main = main.str.replace(i, '')
         return(main)
>>> df['0'] = df['0'].map(lambda x: removeColor(x['0'],x['2']))

這將導致TypeError。

TypeError:字符串索引必須是整數

我的預期輸出如下所示:

                     0                  1
0  2012 Toyota Corolla    White/Black/Red
1    2013 Toyota Camry    Red
2     2015 Honda Civic    Blue
3         2012 Mazda 6    Black/Red/White
4   2011 Nissan Maxima    White/Red/Black

map僅適用於系列。 在您的lambda函數中, x將是一個字符串(列“ 0”的值),因此當您執行x["0"]x["1"]它試圖從字符串中獲取索引,因此會出現錯誤。

apply函數使您可以對整個行(或列)進行操作,因此更適合。 這是完成您所追求的目標的一種方法:

import re

def remove_color(row):
    return re.sub(row.iloc[1].replace("/", "|"), "", row.iloc[0]).replace("  ", " ")


df.iloc[:, 0] = df.apply(remove_color, axis=1)

您可以將iloc調用替換為特定的列名,以使其更具可讀性(您提到的col名稱可以是任何東西,因此我在這里提供了一種通用方法)。

第二個replace調用是刪除re.sub剩余的多余空間。 您可以修改re.sub以在單個調用中執行此操作,但是可能會變得凌亂。

import pandas as pd

iLoc = pd.DataFrame({'0': ['2012 Black Toyota Corolla','2013 Red Toyota Camry','2015 Blue Honda Civic','2012 Black Mazda 6','2011 White Nissan Maxima'],'1': ['White/Black/Red','Red','Blue','Black/Red/White','White/Red/Black']})

display(iLoc)

def removeColor(main,sub):
    for i in range(len(main)):
        for j in str(sub[i]).split('/'):
            main[i] = main[i].replace(j, '').replace('  ',' ').strip()
    return main

iLoc["0"] = removeColor(iLoc["0"],iLoc["1"])

display(iLoc)

您的方法部分正確。
您需要從系列中提取值,並將每個主行替換為其來自相同索引的子字符串行

暫無
暫無

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

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