Python pandas-基于另一列中的int的str(行)切片
我有一个df: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'
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