如何在pandas中的另一列中对列中的字符串进行切片

时间:2017-08-05 14:29:50

标签: python pandas

df=pd.DataFrame({'A':['abcde','fghij','klmno','pqrst'], 'B':[1,2,3,4]})

我想按列B对列A进行切片,例如:abcde[:1]=a, klmno[:3]=klm 但是有两个陈述都失败了:

df['new_column']=df.A.map(lambda x: x.str[:df.B])
df['new_column']=df.apply(lambda x: x.A[:x.B]) 
  

TypeError:字符串索引必须是整数

df['new_column']=df['A'].str[:df['B']]

new_column返回NaN

尝试获取new_column

      A    B  new_column
0   abcde  1     a
1   fghij  2     fg
2   klmno  3     klm
3   pqrst  4     pqrs

非常感谢

2 个答案:

答案 0 :(得分:5)

apply方法中需要axis=1才能遍历行:

df['new_column'] = df.apply(lambda r: r.A[:r.B], axis=1)
df
#       A   B   new_column
#0  abcde   1   a
#1  fghij   2   fg
#2  klmno   3   klm
#3  pqrst   4   pqrs

使用zip

时,一种不那么惯用但通常更快的解决方案
df['new_column'] = [A[:B] for A, B in zip(df.A, df.B)]
df

#       A   B   new_column
#0  abcde   1   a
#1  fghij   2   fg
#2  klmno   3   klm
#3  pqrst   4   pqrs
%timeit df.apply(lambda r: r.A[:r.B], axis=1)
# 1000 loops, best of 3: 440 µs per loop

%timeit [A[:B] for A, B in zip(df.A, df.B)]
# 10000 loops, best of 3: 27.6 µs per loop

答案 1 :(得分:0)

使用zip。愿这个解决方案对您有所帮助。

enter image description here