我有一个包含多个产品名称的列,例如 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)
函数式编程
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]
添加回答
举报
0/150
提交
取消