使用正则表达式提取子串解析pandas df列

时间:2016-09-29 11:40:16

标签: python regex pandas text

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

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

我可以看到:

  1. 文本的开头始终包含我要提取的第一个字符串
  2. 其余的字符串介于" ::"和";"
  3. 我想创建一个包含以下内容的新列:

    String1, String2, String3, String4
    

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

    如何解决问题?

    感谢您的帮助

3 个答案:

答案 0 :(得分: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']})

答案 1 :(得分:0)

考虑使用列df

的数据框txt
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

enter image description here

使用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

答案 2 :(得分:0)

我只是应用一个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(";")))