Python 在pandas中两列文本的第二部分中创建一列

Python 在pandas中两列文本的第二部分中创建一列,python,pandas,Python,Pandas,我有一个有两列的数据框。我想创建第三列,它是 前两列之和,但不包含每列的第一位。我认为最好用一个例子来说明这一点: col1 col2 col3 (need to make) abc_what_I_want1 abc_what_I_want1 what_I_want1what_I_want1 psdb_what_I_want2 what_I_want2 vxc_what_I_

我有一个有两列的数据框。我想创建第三列,它是 前两列之和,但不包含每列的第一位。我认为最好用一个例子来说明这一点:

col1                col2                 col3 (need to make)
abc_what_I_want1    abc_what_I_want1     what_I_want1what_I_want1
psdb_what_I_want2                        what_I_want2
vxc_what_I_want3    vxc_what_I_want3     what_I_want3what_I_want3
qk_what_I_want4     qk_what_I_want4      what_I_want4what_I_want4
                    ertsa_what_I_want5   what_I_want5
abc_what_I_want6    abc_what_I_want6     what_I_want6what_I_want6
请注意,每行所需的内容将不同,但同一行中的列之间相同。每行的前缀始终相同,但行之间可以不同/重复。显示为空白的单元格是字符串

到目前为止,我掌握的代码是:

 df["col3"] = df["col1"].str.split("_", 1) + df["col2"].str.split("_", 1)
从这里开始,我只需要拆分的第二个或最后一个元素,因此我尝试了以下两种方法:

 df["col3"] = df["col1"].str.split("_", 1)[1] + df["col2"].str.split("_", 1)[1]
 df["col3"] = df["col1"].str.split("_", 1)[-1] + df["col2"].str.split("_", 1)[-1]

这两个都返回了错误。我认为第一个错误是由于复制值ValueError:无法从复制轴重新编制索引。第二个是Keyvalue错误。

您实际上非常接近,只需要使用str[1]选择正确的切片,同时为空单元格填充NA:

m = df['col1'].str.split('_', 1).str[1].fillna('') + df['col2'].str.split('_', 1).str[1].fillna('')
df['col3'] = m
另一种方法是使用apply,您可以一次对多个列应用拆分:

m = df[['col1', 'col2']].apply(lambda x: x.str.split('_', 1).str[1]).fillna('')
df['col3'] = m['col1']+m['col2']

您实际上非常接近,只需要使用str[1]选择正确的切片,同时为空单元格填充NA:

m = df['col1'].str.split('_', 1).str[1].fillna('') + df['col2'].str.split('_', 1).str[1].fillna('')
df['col3'] = m
另一种方法是使用apply,您可以一次对多个列应用拆分:

m = df[['col1', 'col2']].apply(lambda x: x.str.split('_', 1).str[1]).fillna('')
df['col3'] = m['col1']+m['col2']
可以替换所有字符直到第一个下划线,然后在轴=1上应用联接或求和:

或:

或:

可以替换所有字符直到第一个下划线,然后在轴=1上应用联接或求和:

或:

或:


你为什么要这么做?新的复合柱的最终目的是什么?“我想要什么”占位符实际上代表什么?电子商务订单?拉特伦库兹?请提供更多的上下文。这感觉像是一个错误。听起来像是数据帧合并/连接或字符串连接在一开始就被过度使用了,如果不是的话,这个问题就不会出现。@smci我正在尝试按所需col3中的值对行进行排序。它本质上是一个名字。前缀包含在结束后排序中也需要的信息,但我不想按排序。没有过度使用的merge/join/concat。以前没有将值拆分为prefix/what_I_所需的值,除此之外,将来也没有拆分的时间。不过,你为什么要这么做呢?新的复合柱的最终目的是什么?“我想要什么”占位符实际上代表什么?电子商务订单?拉特伦库兹?请提供更多的上下文。这感觉像是一个错误。听起来像是数据帧合并/连接或字符串连接在一开始就被过度使用了,如果不是的话,这个问题就不会出现。@smci我正在尝试按所需col3中的值对行进行排序。它本质上是一个名字。前缀包含在结束后排序中也需要的信息,但我不想按排序。没有过度使用的merge/join/concat。以前没有将值拆分为prefix/what_I_所需的值,除此之外,将来也没有将值拆分为prefix/what_I_所需的值的时间。这些方法也很好。我接受了厄尔凡的回答,因为他是第一个,并且是建立在我已有的基础上的。我接受了厄尔凡的回答,因为他是第一个,是建立在我已有的基础上的。
df['Col3']=df.replace('^[^_]*_','',regex=True).fillna('').apply(''.join,axis=1)
df['Col3']=df.replace('^[^_]*_','',regex=True).fillna('').sum(axis=1)
df['Col3']=(pd.Series(df.replace('^[^_]*_','',regex=True).fillna('').values.tolist())
                                                             .str.join(''))
                col1                col2                      Col3
0   abc_what_I_want1    abc_what_I_want1  what_I_want1what_I_want1
1  psdb_what_I_want2        what_I_want2       what_I_want2I_want2
2   vxc_what_I_want3    vxc_what_I_want3  what_I_want3what_I_want3
3    qk_what_I_want4     qk_what_I_want4  what_I_want4what_I_want4
4                NaN  ertsa_what_I_want5              what_I_want5
5   abc_what_I_want6    abc_what_I_want6  what_I_want6what_I_want6