Python pandas-基于另一列中的int的str(行)切片

Python pandas-基于另一列中的int的str(行)切片,python,string,pandas,Python,String,Pandas,我有一个df: colA colB 0 'abcde' 4 1 'abcde' 2 2 'abcde' 1 3 np.nan np.nan 4 'wxyz' 3 5 'wxyz' 2 我希望能够根据colB中的值从colA中删除前X个字符,并将该值返回到新的列C,如下所示 colA colB colC 0 'abcde' 4 'e' 1 'abcde' 2 'cde' 2 'abcde'

我有一个df:

   colA    colB
0 'abcde'    4
1 'abcde'    2
2 'abcde'    1
3  np.nan   np.nan
4 'wxyz'     3
5 'wxyz'     2
我希望能够根据colB中的值从colA中删除前X个字符,并将该值返回到新的列C,如下所示

   colA    colB     colC
0 'abcde'    4      'e'
1 'abcde'    2      'cde'
2 'abcde'    1      'bcde'
3  np.nan   np.nan  np.nan
4 'wxyz'     3      'z'
5 'wxyz'     2      'yz'
我已经尝试了一些。在这里使用.str[x:]应用lambda,但是由于其他行中的空值,在保存它时遇到了问题


非常感谢任何帮助

如果索引失败,您可以为返回缺少的值创建自定义函数:

def f(a, b):
    try:
        return a[int(b):]
    except:
        return np.nan

df['colC'] = [f(a,b) for a, b in zip(df['colA'], df['colB'])]
或:


测试非缺失值的另一个想法:

df['colC'] = [a[int(b):] if pd.notna(a) and pd.notna(b) 
                         else np.nan 
                         for a, b in zip(df['colA'], df['colB'])]
print (df)
    colA  colB  colC
0  abcde   4.0     e
1  abcde   2.0   cde
2  abcde   1.0  bcde
3    NaN   NaN   NaN
4   wxyz   3.0     z
5   wxyz   2.0    yz
可能是最好的,可读性更好,但如果您想用一行程序来完成,您可以使用。尽管名称很吓人,但它不会改变原始数据帧,除非您使用参数
inplace=True
调用它

df['colC']=df.dropna().apply(lambda x:x[0][int(x[1]):],axis=1) >>>打印(df) 可乐 0 abcde 4.0 e 1 abcde 2.0 cde 2 abcde 1.0 bcde 3楠楠楠楠楠 4 wxyz 3.0 z 5 wxyz 2.0 yz
是否可以删除nan行?数据中的这些引号存在于实际数据中,或者您已将其包括在内@迅捷的
print (df)
    colA  colB  colC
0  abcde   4.0     e
1  abcde   2.0   cde
2  abcde   1.0  bcde
3    NaN   NaN   NaN
4   wxyz   3.0     z
5   wxyz   2.0    yz
df['colC'] = [a[int(b):] if pd.notna(a) and pd.notna(b) 
                         else np.nan 
                         for a, b in zip(df['colA'], df['colB'])]
print (df)
    colA  colB  colC
0  abcde   4.0     e
1  abcde   2.0   cde
2  abcde   1.0  bcde
3    NaN   NaN   NaN
4   wxyz   3.0     z
5   wxyz   2.0    yz