为了账号安全,请及时绑定邮箱和手机立即绑定

将列值划分为部分并将部分名称存储在新列 pandas 中

将列值划分为部分并将部分名称存储在新列 pandas 中

烙印99 2023-03-08 10:27:41
我有一个包含多个产品名称的列,例如      Contract0      O.U201      O.Z202      O.H213      O.M214      O.U215      O.Z216      O.H227      O.M228     S3.U209     S3.Z2010    S6.M2611    S6.U2612    S6.Z2613    S6.H2714    S9.U2615    S9.Z2616    F3.U2617    F3.Z2618    F3.H2719    F6.H2620    F6.M2621    F6.U2622    F9.U20我想要做的是根据合同名称分配部分名称,例如   Contract Sections0     O.U20      O11     O.Z20      O12     O.H21      O13     O.M21      O14     O.U21      O25     O.Z21      O26     O.H22      O27     O.M22      O28    S3.U20       S39    S3.Z20       S310   S6.M26       S611   S6.U26       S612   S6.Z26       S613   S6.H27       S614   S9.U26       S915   S9.Z26       S916   F3.U26       F317   F3.Z26       F318   F3.H27       F319   F6.H26       F620   F6.M26       F621   F6.U26       F622   F9.U20       F9对于 S 和 F 系列,我可以使用此代码实现所需的结果(如果有更好的实现方法,请告诉我)df.loc[df['Contract'].str.contains('S3'),'Sections'] = 'S3'df.loc[df['Contract'].str.contains('S6'),'Sections'] = 'S6'df.loc[df['Contract'].str.contains('S9'),'Sections'] = 'S9'df.loc[df['Contract'].str.contains('F3'),'Sections'] = 'F3'df.loc[df['Contract'].str.contains('F6'),'Sections'] = 'F6'df.loc[df['Contract'].str.contains('F9'),'Sections'] = 'F9'因为它只是匹配分配部分名称的字符串。遗憾的是 O 系列没有附加数字,所以我必须将它分成 4 个块,如上所示   Contract Sections0     O.U20      O11     O.Z20      O12     O.H21      O13     O.M21      O14     O.U21      O25     O.Z21      O26     O.H22      O27     O.M22      O2我尝试了以下代码df.loc[df['Contract'].str.contains('O'),'Sections'] = df.index // 4+1但它抛出错误ValueError: could not broadcast input array from shape (23) into shape (8)我怎样才能以更好、更有效的方式取得成果?请注意,这只是一个样本数据,原始数据集有更多这样的值。
查看完整描述

2 回答

?
www说

TA贡献1775条经验 获得超8个赞

将您的代码更改为

df.loc[df['Contract'].str.contains('O'),'Sections'] = 'O' +((df['Contract'].str.contains('O').cumsum().sub(1)//4) + 1).astype(str)


查看完整回答
反对 回复 2023-03-08
?
函数式编程

TA贡献1807条经验 获得超9个赞

为了简化


df.loc[df['Contract'].str.contains('S3'),'Sections'] = 'S3'

df.loc[df['Contract'].str.contains('S6'),'Sections'] = 'S6'

df.loc[df['Contract'].str.contains('S9'),'Sections'] = 'S9'

df.loc[df['Contract'].str.contains('F3'),'Sections'] = 'F3'

df.loc[df['Contract'].str.contains('F6'),'Sections'] = 'F6'

df.loc[df['Contract'].str.contains('F9'),'Sections'] = 'F9'

只需将其替换为以下 1 行代码:


df['Section'] = df['Contract'].str.split('.').str[0]


查看完整回答
反对 回复 2023-03-08
  • 2 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信