如何在python中使用条件拆分字符串数据?

时间:2019-07-19 04:30:10

标签: python python-3.x pandas dataframe

我想知道数据帧中字符串列表的某种表达方式。 如何使用python分割字符串值? 我正在使用替换方法。 但是,我找不到只删除节点号的方法。

数据框

index    article_id
0      ['@abc_172', '@abc_249', '@abc-32', '@def-1']
1      ['@az3_2', '@bwc_4', '@xc-34', '@xc-1']   
2      ['@ac_12']
3      ['#ea457870a2d32453609f52e50f84abdc_15', '@bb_3']
4       ...
...     ...

我想得到这样

index       article_id                      article_id_unique_count
0      ['abc', 'abc', 'abc', 'def']                   2
1      ['az3', 'bwc', 'xc', 'xc']                     3
2      ['ac']                                         1
3      ['#ea457870a2d32453609f52e50f84abdc', 'bb']    2

 ...

4 个答案:

答案 0 :(得分:2)

使用re.findall

df['article_id'] =  df.article_id.apply(lambda x: re.findall('([#a-z0-9]+)',x)).apply(lambda x: [i for i in x if i.isdigit() == False])

df['article_id_unique_count'] = df['article_id'].apply(lambda x: len(set(x)))

输出

                                article_id  article_id_unique_count
0                     [abc, abc, abc, def]                        2
1                       [az3, bwc, xc, xc]                        3
2                                     [ac]                        1
3  [#ea457870a2d32453609f52e50f84abdc, bb]                        2

答案 1 :(得分:0)

在应用中设置正则表达式,并设置为计算列表中的唯一元素

import re
df = pd.DataFrame(data={"id":[0,1,2],
                        "article_id":[["abc_172", "@abc_249", "@abc-32", "@def-1"],
                                      ["@az3_2", "@bwc_4", "@xc-34", "@xc-1"],
                                      ["@#ea457870a2d32453609f52e50f84abdc_15"]]})

df['article_id'] = df['article_id'].apply(lambda x : re.sub('[!@$]','', i).split("-")[0].split("_")[0] for i in x])
df['article_id_unique_count'] = df['article_id'].apply(lambda x : len(set(x)))

   id                           article_id  article_id_unique_count
0   0                 [abc, abc, abc, def]                        2
1   1                   [az3, bwc, xc, xc]                        3
2   2  [#ea457870a2d32453609f52e50f84abdc]                        1

答案 2 :(得分:0)

假设分隔符为-_

df['article_id'].map(lambda x:[re.findall('@*(.+?)[-_]', s)[0] for s in x], 1)

输出:

0                       [abc, abc, abc, def]
1                         [az3, bwc, xc, xc]
2                                       [ac]
3    [#ea457870a2d32453609f52e50f84abdc, bb]

然后您可以使用apply(lambda x:len(set(x)))

请注意,第1行az3的第一个元素也已正确提取。

答案 3 :(得分:0)

使用apply的其他解决方案。我总是尝试在不使用apply的情况下找到解决方案。我想出了这个。从列表stack到列表str.extractagg

的简单构造数据帧
(pd.DataFrame(df.article_id.tolist(), index=df.index).stack().str.extract(r'@?(.*)[_-]')
            .groupby(level=0)[0].agg([list, 'nunique'])
            .rename(columns={'list': 'article_id', 'nunique': 'article_id_unique_count'}))

Out[15]:
                                article_id  article_id_unique_count
0                     [abc, abc, abc, def]                        2
1                       [az3, bwc, xc, xc]                        3
2                                     [ac]                        1
3  [#ea457870a2d32453609f52e50f84abdc, bb]                        2