python - 根据多个条件拆分 DF 中的列
问题描述
我有一个包含多列的 df。我需要将其中一列分成两列,一列基于 ID,另一列基于描述。
例如在第 34 行:
data['cpv'][34] = '45232460-4 - Obras de saneamento'
我需要获得 column cpvid
to be45232460-4
和 column cpvdescription
to be 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 和多个描述。我想知道是否有任何有效的方法可以根据多个条件拆分列。这意味着第一个条件是' - '(在括号中的空格)和另一个条件是'|'。
有人可以帮忙吗?我还是个新手,我试图找到一些类似的帖子,但似乎没有一个适合我想要的输出。
谢谢!
解决方案
如果您想要长格式,您可以结合使用字符串拆分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...
推荐阅读
- android - React Native 阻止/关闭电话拨号
- html - React Native 中的 react-native-webview 不能为 Android 滚动
- ios - 如何以编程方式获取在 iOS 设置应用程序中显示的本地化字符串?
- javascript - 使用 FS 模块将内容插入对象
- pandas - pandas:使用列数组索引 GroupBy 对象
- arrays - 从 Google 表格中的 ImportHTML 查询中删除数据
- android - RN:永久隐藏键盘
- c++ - 无法构建 7z.dll
- javascript - 如何使用 npm 在 laravel mix 中安装和使用 jquery-ui
- node.js - .then() 不起作用,承诺抛出错误,但是当我删除 for 循环时,它开始工作!为什么?