【问题标题】:Parse pandas df column with regex extracting substrings使用正则表达式提取子字符串解析 pandas df 列
【发布时间】:2017-02-07 17:17:18
【问题描述】:

我有一个 pandas df,其中包含一个由如下文本组成的列:

String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_text::some_text

我可以看到:

  1. 文本的开头总是包含我要提取的第一个字符串
  2. 其余字符串位于“::”和“;”之间

我想创建一个新列,其中包含:

String1, String2, String3, String4

全部用逗号分隔,但仍在同一列中。

如何解决问题?

感谢您的帮助

【问题讨论】:

    标签: python regex pandas text


    【解决方案1】:

    试试这个:

    In [136]: df.txt.str.findall(r'String\d+').str.join(', ')
    Out[136]:
    0    String1, String2, String3, String4
    Name: txt, dtype: object
    

    数据:

    In [137]: df
    Out[137]:
                                                                                                       txt
    0  String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_t...
    

    设置:

    df = pd.DataFrame({'txt': ['String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_text::some_text']})
    

    【讨论】:

    • 我实际上检查了列的数据类型,它是“对象”。我无法对其进行编码,因为它说..“UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 1679: ordinal not in range(128)”当我尝试时:df.column。 astype(str).
    【解决方案2】:

    考虑带有txt列的数据框df

    df = pd.DataFrame(['String1::some_text::some_text;String2::some_text::;String3::some_text::some_text;String4::some_text::some_text'] * 10,
                      columns=['txt'])
    df
    


    使用str.splitgroupby 的组合

    df.txt.str.split(';', expand=True).stack() \
          .str.split('::').str[0].groupby(level=0).apply(list)
    
    0    [String1, String2, String3, String4]
    1    [String1, String2, String3, String4]
    2    [String1, String2, String3, String4]
    3    [String1, String2, String3, String4]
    4    [String1, String2, String3, String4]
    5    [String1, String2, String3, String4]
    6    [String1, String2, String3, String4]
    7    [String1, String2, String3, String4]
    8    [String1, String2, String3, String4]
    9    [String1, String2, String3, String4]
    dtype: object
    

    【讨论】:

    • 它有效。但我不明白为什么将它应用到列表方法。如何将其保留为上一个数据框中的简单新列?
    • @xxxvinxxx 列表函数将可迭代对象转换为列表。将此分配给数据框列,您就拥有了所需的内容。
    【解决方案3】:

    我只会应用一个 lambda 函数来执行您想要执行的操作(首先在“;”上拆分,然后在“::”上拆分并保留第一个元素,然后将它们重新加入):

    df['new_col'] = df['old_col'].apply(lambda s: ", ".join(t.split("::")[0] for t in s.split(";")))
    

    您也可以避免在 :: 上拆分,因为只需在第一个 : 之前停止就足够了:

    df['new_col'] = df['old_col'].apply(lambda s: ", ".join(t[:t.index(":")] for t in s.split(";")))
    

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多