我想知道数据帧中字符串列表的某种表达方式。 如何使用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
...
答案 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.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