[英]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?t
- 帶有可選e
的Ticket
\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.