首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于多个条件的DF中的列拆分

基于多个条件的DF中的列拆分
EN

Stack Overflow用户
提问于 2021-10-25 15:39:37
回答 1查看 480关注 0票数 0

我有一个有多列的df。我需要将其中一列分成两列,一列基于ID,另一列基于描述。

例如,在第34行:

代码语言:javascript
运行
复制
data['cpv'][34] = '45232460-4 - Obras de saneamento'

我需要获得列cpvid45232460-4,列cpvdescriptionObras de saneamento。这很容易用字符串拆分来实现。

然而,在某些情况下

代码语言:javascript
运行
复制
df['cpv'][45] = '45112500-0 - Movimento de terras | 45232411-6 - Construção de condutas para águas residuais | 45232423-3 - Construção de estações de bombagem de águas residuais'

这意味着同一行中有多个ID和多个描述。我想知道是否有任何基于多个条件拆分列的有效方法。这意味着第一个条件将是'-‘(括号下表示空格),而另一个条件则是’\‘。

有人能帮忙吗?我仍然是一个新手,我试图找到一些类似的帖子,但似乎没有一个符合我的期望输出。

谢谢!

EN

Stack Overflow用户

回答已采纳

发布于 2021-10-26 12:39:29

如果您想要长格式,可以使用字符串拆分和explode方法(我已经根据您的数据创建了一个虚拟df ):

代码语言:javascript
运行
复制
df = pd.DataFrame({
    'cpv':['45232460-4 - Obras de saneamento', '45112500-0 - Movimento de terras | 45232411-6 - Construção de condutas para águas residuais | 45232423-3 - Construção de estações de bombagem de águas residuais'],
    'val':[1,2]
})

df = df.assign(cpv=df.cpv.str.split(r' \| ')).explode('cpv')

df = pd.concat([df, df.cpv.str.split(r' - ', expand=True).rename(columns={0:'cpvid', 1:'cpvdescription'})], axis=1).drop('cpv', axis=1)

print(df)

val       cpvid                                     cpvdescription
0    1  45232460-4                                Obras de saneamento
1    2  45112500-0                                Movimento de terras
1    2  45232411-6        Construção de condutas para águas residuais
1    2  45232423-3  Construção de estações de bombagem de águas re...

如果您想要宽格式,可以尝试:

代码语言:javascript
运行
复制
df = pd.DataFrame({
    'cpv':['45232460-4 - Obras de saneamento', '45112500-0 - Movimento de terras | 45232411-6 - Construção de condutas para águas residuais | 45232423-3 - Construção de estações de bombagem de águas residuais'],
    'val':[1,2]
})

cpv_df = pd.DataFrame(df.assign(cpv=df.cpv.str.split(r' \| ')).cpv.to_list())

df = pd.concat([df]+[cpv_df[col].str.split(r' - ', expand=True).rename(columns={0:f'cpvid_{col}', 1:f'cpvdescription_{col}'}) for col in cpv_df], axis=1).drop('cpv', axis=1)

print(df)

   val     cpvid_0     cpvdescription_0     cpvid_1  \
0    1  45232460-4  Obras de saneamento        None   
1    2  45112500-0  Movimento de terras  45232411-6   

                              cpvdescription_1     cpvid_2  \
0                                         None        None   
1  Construção de condutas para águas residuais  45232423-3   

                                    cpvdescription_2  
0                                               None  
1  Construção de estações de bombagem de águas re...  
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69710985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档