【问题标题】:pandas - str (row) slicing based on int in another columnpandas - str(行)基于另一列中的 int 切片
【发布时间】:2020-04-17 15:13:57
【问题描述】:

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

我在1 用 .str[x:] 尝试了一些 .apply lambda,但由于其他行中的 null 值而无法将其保存回来。

非常感谢任何帮助!

【问题讨论】:

  • 可以删除 nan 行吗?
  • 数据中的那些引号在实际数据中有还是你已经包含了? @swifty

标签: python string pandas


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    jezrael's answer 可能是最好的并且更具可读性,但如果你想在单行中做到这一点,你可以使用df.dropna()。尽管名字很吓人,但它不会改变你原来的 DataFrame,除非你用参数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
    

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 1970-01-01
      • 2020-09-02
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 2021-02-12
      • 2015-07-19
      相关资源
      最近更新 更多