[英]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.