如何在python中使用Criteria分割字符串数据?
我想知道数据帧中字符串列表的一些表达式。 如何使用python拆分字符串值? 我正在使用替换方法。 但是,我找不到只删除节点号的方法 数据帧如何在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
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