繁体   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