python - 在 Python 中拆分和提取后字符串行丢失
问题描述
对于dict
如下格式:
data = {'log_id': 8972641530831729293, 'words_result_num': 20, 'words_result': [{'words': '05B01企商联登记注册代理事务所(通合伙)'}, {'words': 'Unit-D 608华夏启商(企业管理有限公司)'}, {'words': '中睿智诚商业管理有限公司'}, {'words': '17/F(1706)美泰德商务咨询有限公司'}, {'words': 'A2006~A2007新曙光会计服务有限公司'}, {'words': '2906-10建筑与室内设计师网'}, {'words': '中建瑞达'}]}
我想从字符串左侧提取数字、字母或标点符号words
作为 的列office_name
,其余作为 的列company_name
。
一般来说,我可以得到我想要的,但是当words
没有数字、字母或标点符号时,在拆分和提取之后,这些行会被遗漏并变成NaN
s。
df = DataFrame(data)
cols_to_drop = ['log_id', 'words_result_num']
df = df[df.columns.drop(cols_to_drop)]
df['words_result'] = df['words_result'].astype(str)
df['words_result'] = df['words_result'].map(lambda x: x.lstrip("{").rstrip("}"))
df['company_info'] = df['words_result'].str.split(': ').str[1]
df['company_info'] = df['company_info'].map(lambda x: x.lstrip("' ").rstrip("'"))
pat = r'([\x00-\x7F]+)([\u4e00-\u9fff]+.*$)'
#pat = r'(^(\d+))(\s+([^\u4e00-\u9fff]+).*$)'
df[['office_name','company_name']] = df.pop('company_info').str.extract(pat)
del df['words_result']
print(df)
输出:
office_name company_name
0 05B01 企商联登记注册代理事务所(通合伙)
1 Unit-D 608 华夏启商(企业管理有限公司)
2 NaN NaN
3 17/F(1706) 美泰德商务咨询有限公司
4 A2006~A2007 新曙光会计服务有限公司
5 2906-10 建筑与室内设计师网
6 NaN NaN
如何获得以下预期结果?非常感谢你的帮助。
office_name company_name
0 05B01 企商联登记注册代理事务所(通合伙)
1 Unit-D 608 华夏启商(企业管理有限公司)
2 NaN 中睿智诚商业管理有限公司
3 17/F(1706) 美泰德商务咨询有限公司
4 A2006~A2007 新曙光会计服务有限公司
5 2906-10 建筑与室内设计师网
6 NaN 中建瑞达
解决方案
想法是用原始值替换缺失值fillna
:
cols_to_drop = ['log_id', 'words_result_num']
df = df[df.columns.drop(cols_to_drop)]
s = df.pop('words_result').apply(lambda x: x['words'])
pat = r'([\x00-\x7F]+)([\u4e00-\u9fff]+.*$)'
#pat = r'(^(\d+))(\s+([^\u4e00-\u9fff]+).*$)'
df[['office_name','company_name']] = s.str.extract(pat)
df['company_name'] = df['company_name'] .fillna(s)
print(df)
office_name company_name
0 05B01 企商联登记注册代理事务所(通合伙)
1 Unit-D 608 华夏启商(企业管理有限公司)
2 NaN 中睿智诚商业管理有限公司
3 17/F(1706) 美泰德商务咨询有限公司
4 A2006~A2007 新曙光会计服务有限公司
5 2906-10 建筑与室内设计师网
6 NaN 中建瑞达
你的解决方案应该改变:
cols_to_drop = ['log_id', 'words_result_num']
df = df[df.columns.drop(cols_to_drop)]
df['words_result'] = df['words_result'].astype(str)
df['words_result'] = df['words_result'].map(lambda x: x.lstrip("{").rstrip("}"))
s = df['words_result'].str.split(': ').str[1]
s = s.map(lambda x: x.lstrip("' ").rstrip("'"))
#s = df['company_info']
pat = r'([\x00-\x7F]+)([\u4e00-\u9fff]+.*$)'
#pat = r'(^(\d+))(\s+([^\u4e00-\u9fff]+).*$)'
df[['office_name','company_name']] = s.str.extract(pat)
del df['words_result']
df['company_name'] = df['company_name'] .fillna(s)
print(df)
office_name company_name
0 05B01 企商联登记注册代理事务所(通合伙)
1 Unit-D 608 华夏启商(企业管理有限公司)
2 NaN 中睿智诚商业管理有限公司
3 17/F(1706) 美泰德商务咨询有限公司
4 A2006~A2007 新曙光会计服务有限公司
5 2906-10 建筑与室内设计师网
6 NaN 中建瑞达
推荐阅读
- flutter - 从颤动的警报对话框中更改地图的值时如何在ListVIew上查看动态值?
- azure-devops - 在 Azure DevOps 中等待 ADF 集成运行时 http start 调用完成
- migration - 如何将非常旧的 ArcGIS.Client dll 更新到 ArcGISRuntime 版本 100.7
- python - wtform selectfield 验证不选择列表中的第一个
- c# - 如何通过 Xamarin Forms 使用 WPF 隐藏任务栏和最大化窗口
- vue.js - 在 Vue.js 的 V-if 中使用 V-for 是一种好习惯吗?
- c - 将整数变量与字符进行比较
- azure-devops - 使用相互 SSL 从 azure 管道访问外部存储库
- python - 对上传到 S3 的类进行单元测试
- javascript - 角度路由,使用网点创建路由