我有一个有多列的df。我需要将其中一列分成两列,一列基于ID,另一列基于描述。
例如,在第34行:
data['cpv'][34] = '45232460-4 - Obras de saneamento'我需要获得列cpvid为45232460-4,列cpvdescription为Obras de saneamento。这很容易用字符串拆分来实现。
然而,在某些情况下
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和多个描述。我想知道是否有任何基于多个条件拆分列的有效方法。这意味着第一个条件将是'-‘(括号下表示空格),而另一个条件则是’\‘。
有人能帮忙吗?我仍然是一个新手,我试图找到一些类似的帖子,但似乎没有一个符合我的期望输出。
谢谢!
发布于 2021-10-26 12:39:29
如果您想要长格式,可以使用字符串拆分和explode方法(我已经根据您的数据创建了一个虚拟df ):
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...如果您想要宽格式,可以尝试:
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... https://stackoverflow.com/questions/69710985
复制相似问题