簡體   English   中英

根據 Pandas 中列的內容將列拆分為多列

[英]Split column into multiple columns based on content of column in Pandas

我有一列包含這樣的數據

票號:123456789; 位置編號:ABC123; 類型:網絡;

票號132123456,地點ID:ABC444; 類型:應用程序

票號#222256789; 位置編號:AMC121; 類型:網絡;

我正在嘗試這樣

new = data["Description"].str.split(";", n = 1, expand = True)
data["Ticket"]= new[0]
data["Location"]= new[1]  
data["Type"]= new[2]

# Dropping old  columns
data.drop(columns =["Description"], inplace = True)

我可以根據“;”分開但是如何為兩者做“;” 和 ”,”?

一個更通用的解決方案,它允許您舒適地執行盡可能多的處理。 讓我們首先定義一個示例 dataframe 以便於調試:

df = pd.DataFrame({'Description': [
    'Ticket NO: 123456789 , Location ID:ABC123; Type:Network;',
    'Ticket NO: 123456789 ; Location ID:ABC123; Type:Network;']})

然后,讓我們定義我們的處理 function,在這里你可以做任何你喜歡的事情:

def process(row):
    parts = re.split(r'[,;]', row)
    return pd.Series({'Ticket': parts[0], 'Location': parts[1], 'Type': parts[2]})

除了按,; 然后分成 3 個部分,您可以添加將去除空白字符的代碼,刪除冒號左側的任何內容等。例如,嘗試:

def process(row):
    parts = re.split(r'[,;]', row)
    data = {}
    for part in parts:
        for field in ['Ticket', 'Location', 'Type']:
            if field.lower() in part.lower():
                data[field] = part.split(':')[1].strip()
    return pd.Series(data)

最后,申請得到結果:

df['Description'].apply(process)

這比在單個正則表達式中完成所有事情更具可讀性和易於維護性,尤其是當您最終可能需要額外的處理時。

此應用程序的 output 將如下所示:

部分輸出

要將這個 output 添加到原始 dataframe 中,只需運行:

df[['Ticket', 'Location', 'Type']] = df['Description'].apply(process)

全輸出

您可以使用

new = data["Description"].str.split("[;,]", n = 2, expand = True)
new.columns = ['Ticket', 'Location', 'Type']

Output:

>>> new
                  Ticket             Location            Type
0  Ticket NO: 123456789    Location ID:ABC123   Type:Network;
1   Ticket No. 132123456   Location ID:ABC444        Type:App
2       Tickt#222256789    Location ID:AMC121   Type:Network;

[;,]正則表達式匹配任一; 或 a , char 和n=2將最大拆分設置為兩次。

另一個正則表達式Series.str.extract解決方案:

new[['Ticket', 'Location', 'Type']] = data['Description'].str.extract(r"(?i)Ticke?t\D*(\d+)\W*Location ID\W*(\w+)\W*Type:(\w+)")
>>> new
      Ticket Location     Type
0  123456789   ABC123  Network
1  132123456   ABC444      App
2  222256789   AMC121  Network
>>> 

請參閱正則表達式演示 詳情

  • (?i) - 不區分大小寫的標志
  • Ticke Ticke?t - 帶有可選eTicket
  • \D* - 零個或多個非數字字符
  • (\d+) - 第 1 組:一位或多位數字
  • \W* - 零個或多個非單詞字符
  • Location ID - 一個字符串
  • \W* - 零個或多個非單詞字符
  • (\w+) - 第 2 組:一個或多個單詞字符
  • \W* - 零個或多個非單詞字符
  • Type: - 一個字符串
  • (\w+) - 第 3 組:一個或多個單詞字符

一種使用str.extract的方法

前任:

df[['Ticket', 'Location', 'Type']] = df['Description'].str.extract(r"[Ticket\sNO:.#](\d+).*ID:([A-Z0-9]+).*Type:([A-Za-z]+)", flags=re.I)
print(df[['Ticket', 'Location', 'Type']])

Output:

      Ticket Location     Type
0  123456789   ABC123  Network
1  132123456   ABC444      App
2  222256789   AMC121  Network

暫無
暫無

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

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