搜索

查看: 3106|回复: 11

[Python] Pandas使用分隔符或正则表达式将字符串拆分为多列

[复制链接]
发表于 2023-5-4 17:19:27 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:19:27 3106 11 看全部
目录
  • str.split():用定界符分割
  • pandas.Series
  • pandas.DataFrame
  • str.extract():按正则表达式拆分Pandas如何将带有字符串元素的列拆分为多个列。
    使用以下字符串的方法。
  • str.split():用定界符分割
  • str.extract():按正则表达式拆分
    字符串方法是pandas.Series方法。
    适用于pandas.Series或pandas.DataFrame列

    str.split():用定界符分割
    要按定界符(delimiter)进行拆分,使用字符串方法str.split()。

    pandas.Series
    以以下pandas.Series为例。
    import pandas as pd
    s_org = pd.Series(['aaa@xxx.com', 'bbb@yyy.com', 'ccc@zzz.com', 'ddd'], index=['A', 'B', 'C', 'D'])
    print(s_org)
    print(type(s_org))
    # A    aaa@xxx.com
    # B    bbb@yyy.com
    # C    ccc@zzz.com
    # D            ddd
    # dtype: object
    #
    将定界符指定为第一个参数。一个pandas.Series元素作为拆分字符串的列表返回。
    s = s_org.str.split('@')
    print(s)
    print(type(s))
    # A    [aaa, xxx.com]
    # B    [bbb, yyy.com]
    # C    [ccc, zzz.com]
    # D             [ddd]
    # dtype: object
    #
    指定split = True作为参数可分为多个列并以pandas.DataFrame的形式获取。默认值为expand = False。
    没有足够的行划分的元素为“无(None)”。
    df = s_org.str.split('@', expand=True)
    print(df)
    print(type(df))
    #      0        1
    # A  aaa  xxx.com
    # B  bbb  yyy.com
    # C  ccc  zzz.com
    # D  ddd     None
    #
    可以在列中指定获取的pandas.DataFrame的列名。
    df.columns = ['local', 'domain']
    print(df)
    #   local   domain
    # A   aaa  xxx.com
    # B   bbb  yyy.com
    # C   ccc  zzz.com
    # D   ddd     None

    pandas.DataFrame
    如果要通过将pandas.DataFrame的特定列拆分为多列来更新它,这会有些乏味。可能有更好的方法。
    以先前创建的pandas.DataFrame为例。
    print(df)
    #   local   domain
    # A   aaa  xxx.com
    # B   bbb  yyy.com
    # C   ccc  zzz.com
    # D   ddd     None
    在特定的列上使用str.split()获得一个拆分的pandas.DataFrame。
    print(df['domain'].str.split('.', expand=True))
    #       0     1
    # A   xxx   com
    # B   yyy   com
    # C   zzz   com
    # D  None  None
    使用pd.concat()与原始pandas.DataFrame进行串联(联接),并使用drop()方法删除原始列。
    df2 = pd.concat([df, df['domain'].str.split('.', expand=True)], axis=1).drop('domain', axis=1)
    print(df2)
    #   local     0     1
    # A   aaa   xxx   com
    # B   bbb   yyy   com
    # C   ccc   zzz   com
    # D   ddd  None  None
    如果剩余的列很少,则只能选择与pd.concat()串联(联接)时所需的列。
    df3 = pd.concat([df['local'], df['domain'].str.split('.', expand=True)], axis=1)
    print(df3)
    #   local     0     1
    # A   aaa   xxx   com
    # B   bbb   yyy   com
    # C   ccc   zzz   com
    # D   ddd  None  None
    要重命名特定的列,请使用rename()方法。
    df3.rename(columns={0: 'second_LD', 1: 'TLD'}, inplace=True)
    print(df3)
    #   local second_LD   TLD
    # A   aaa       xxx   com
    # B   bbb       yyy   com
    # C   ccc       zzz   com
    # D   ddd      None  None
    参考文章
    Pandas.DataFrame的行名和列名的修改

    str.extract():按正则表达式拆分
    使用字符串方法str.extract()分割正则表达式。
    以以下pandas.Series为例。
    import pandas as pd
    s_org = pd.Series(['aaa@xxx.com', 'bbb@yyy.com', 'ccc@zzz.com', 'ddd'], index=['A', 'B', 'C', 'D'])
    print(s_org)
    # A    aaa@xxx.com
    # B    bbb@yyy.com
    # C    ccc@zzz.com
    # D            ddd
    # dtype: object
    在第一个参数中指定正则表达式。对于每个与正则表达式中用()括起来的组部分匹配的字符串,均对其进行划分。
    提取多个组时,无论参数expand如何,都将返回pandas.DataFrame。
    如果不匹配,则为NaN。
    df = s_org.str.extract('(.+)@(.+)\.(.+)', expand=True)
    print(df)
    #      0    1    2
    # A  aaa  xxx  com
    # B  bbb  yyy  com
    # C  ccc  zzz  com
    # D  NaN  NaN  NaN
    df = s_org.str.extract('(.+)@(.+)\.(.+)', expand=False)
    print(df)
    #      0    1    2
    # A  aaa  xxx  com
    # B  bbb  yyy  com
    # C  ccc  zzz  com
    # D  NaN  NaN  NaN
    如果只有一组,则当参数expand = True时返回pandas.DataFrame,如果expand = False则返回pandas.Series。
    df_single = s_org.str.extract('(\w+)', expand=True)
    print(df_single)
    print(type(df_single))
    #      0
    # A  aaa
    # B  bbb
    # C  ccc
    # D  ddd
    #
    s = s_org.str.extract('(\w+)', expand=False)
    print(s)
    print(type(s))
    # A    aaa
    # B    bbb
    # C    ccc
    # D    ddd
    # dtype: object
    #
    Expand = False是当前版本0.22.0中的默认值,但expand = True将是将来的默认值。
    FutureWarning: currently extract(expand=None) means expand=False (return Index/Series/DataFrame)
    but in a future version of pandas this will be changed to expand=True (return DataFrame)

    如果对正则表达式模式使用命名组(?P …),则该名称将按原样是列名。
    df_name = s_org.str.extract('(?P.*)@(?P.*)\.(?P.*)', expand=True)
    print(df_name)
    #   local second_LD  TLD
    # A   aaa       xxx  com
    # B   bbb       yyy  com
    # C   ccc       zzz  com
    # D   NaN       NaN  NaN
    如果要通过将pandas.DataFrame的特定列划分为多个列来进行更新,请参考上面的str.split()示例。使用pd.concat()连接(联接)原始的pandas.DataFrame并使用drop()方法删除原始的列。
    到此这篇关于Pandas使用分隔符或正则表达式将字符串拆分为多列的文章就介绍到这了,更多相关Pandas 字符串拆分为多列内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-28 22:45:31 | 显示全部楼层
    dxf17 2023-6-28 22:45:31 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-28 23:39:58 | 显示全部楼层
    哈哈SE7 2023-6-28 23:39:58 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 08:37:01 | 显示全部楼层
    普通人物怨 2023-6-29 08:37:01 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    回复

    使用道具 举报

    发表于 2023-6-29 14:18:00 | 显示全部楼层
    音乐之家1 2023-6-29 14:18:00 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-6-29 16:20:49 | 显示全部楼层
    123456819 2023-6-29 16:20:49 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 09:35:19 | 显示全部楼层
    六翼天使494 2023-6-30 09:35:19 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 09:42:01 | 显示全部楼层
    幸福341 2023-6-30 09:42:01 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-6-30 12:08:06 | 显示全部楼层
    尘埃416 2023-6-30 12:08:06 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-30 15:33:49 | 显示全部楼层
    我是的十八簿 2023-6-30 15:33:49 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表