Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用Criteria分割字符串数据?_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

如何在python中使用Criteria分割字符串数据?

如何在python中使用Criteria分割字符串数据?,python,python-3.x,pandas,dataframe,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 ['#ea457870a2d32453609f52e50f84

我想知道数据帧中字符串列表的一些表达式。 如何使用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

 ...

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

在apply中应用regex并设置为对列表中的唯一元素计数

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)))


假设分隔符是
-

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
也被正确提取。

使用
的其他解决方案也适用。我总是尝试在不使用
apply
的情况下找到解决方案。我想出了这个。从列表中简单构造数据框,
堆栈
到系列,并使用
str.extract
agg

(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

非常感谢你!非常感谢你的帮助。我想知道这个值“#ea457870a2d32453609f52e50f84abdc15”。这是有别于其他id值的文章id。我怎样才能组合这个来修改它?预期的输出是什么..abdc?好的,我会试试你推荐的方法!感谢您的反馈..查看..如果您有任何建议,欢迎编辑..@AndyL。我更喜欢没有
应用的解决方案:)非常感谢!非常感谢你的帮助。如上所述,我想知道类似此值“#EA457870A2D32453609F52E50F84ABDC15”的信息。这是有别于其他id值的文章id。我怎样才能组合起来修改它呢?
re.sub(“[^A-Za-z]+”,“”,i)
这个正则表达式实际上只从字符串中提取字母表,你需要定义你想从字符串中提取什么类型的字符
。\ea457870a2d32453609f52e50f84abdc\u 15
根据这篇文章\u id正确的articleId应该是什么?根据我的正则表达式,它只能提取字母谢谢你,克里斯,我尝试了你推荐的方法,但它是运行错误。像这样的“索引器:列表索引超出范围”。我该怎么办?
(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