我有一个这样的数据框
|US3973996|0|0|0|0|US8008573|
|US6162985|0|0|US8309838|US8008573|
然后我用
df_select['pat_num'] = df_select['pat_num'].str.replace('\|+', ',')
df_select['pat_num'] = df_select['pat_num'].str.replace('0', '')
df_select
用于删除“ |”和“ 0”,结果显示如下
,US3973996,,,,,US88573,
US6162985,,,US839838,US88573,
但是我想看到结果是这样的
,US3973996,US88573,
US6162985,US839838,US88573,
如何将多(,)减少为一个?
有什么建议吗?
答案 0 :(得分:1)
在您的代码的基础上,这是一个选项,可链接两个replace
调用和一个strip
调用。
df['pat_num'].str.replace('0', '').str.replace(r'\|+', ',').str.strip(',')
0 US3973996,US88573
1 US6162985,US839838,US88573
Name: pat_num, dtype: object
extractall
可能会为您带来更好的里程:
df['pat_num'].str.extractall(r'(US\d+)')[0].groupby(level=0).agg(','.join)
0 US3973996,US8008573
1 US6162985,US8309838,US8008573
Name: 0, dtype: object
此操作以及下面的findall
选项都将ID的结构用作“ USXXXXXXX”(无论(US\d+)
捕获了什么)。
同样,您也可以使用findall
并加入子列表:
df['pat_num'].str.findall(r'(US\d+)').str.join(',')
0 US3973996,US8008573
1 US6162985,US8309838,US8008573
Name: pat_num, dtype: object
答案 1 :(得分:0)
另一种方法
df[0].str.split('|').apply(lambda x: ','.join([j for j in x if j and len(j) > 2]))
输出
0 US3973996,US8008573
1 US6162985,US8309838,US8008573
Name: 0, dtype: object