在另一列中基于int的行切片

2024-04-28 09:21:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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'

我已经尝试了一些.apply lambda's here1with.str[x:]但是由于其他行中的空值,在保存它时遇到了麻烦

非常感谢任何帮助


Tags: lambdadfnpnanapply个字符abcdecde
2条回答

jezrael's answer可能是最好的,可读性更好,但是如果您想在一行程序中使用^{}。尽管名称很吓人,但它不会改变原始数据帧,除非您使用参数inplace=True调用它

>>> df['colC'] = df.dropna().apply(lambda x: x[0][int(x[1]):], axis=1)

>>> 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

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

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'] = df.apply(lambda x: f(x['colA'], x['colB']), axis=1)

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

相关问题 更多 >