【问题标题】:Remove substring from multiple string columns in a pandas DataFrame从 pandas DataFrame 中的多个字符串列中删除子字符串
【发布时间】:2018-03-16 11:50:34
【问题描述】:

我有一个数据框中的列列表,我想遍历这些列并对它们执行操作。这些列包含日期时间或什么都没有。

对于列表中的每一列,我想将列中包含“20”的每个值修剪为前 10 个字符,否则保持原样。

我已经尝试了几种方法,但得到了各种错误或不完美的结果。

以下版本会抛出“'str' object has no attribute 'apply'”的错误,但如果我不使用“.astype(str)”,则会收到“argument of type 'datetime”的错误.datetime' 不可迭代”。

df_combined[dateColumns] = df_combined[dateColumns].fillna(notFoundText).astype(str)
    print (dateColumns)
    for column in dateColumns:
        for row in range(len(column)):
            print(df_combined[column][row])
            if "20" in (df_combined[column][row]):
                df_combined[column][row].apply(lambda x: x[:10], axis=1)
            print(df_combined[column][row])

停下来。提前致谢。

【问题讨论】:

    标签: python string pandas numpy datetime


    【解决方案1】:

    循环在 Pandas 中被认为是可憎的。我建议只做这样的事情,str.contains + np.where

    for c in df.columns:
        # df[c] = df[c].astype(str) # uncomment this if your columns aren't dtype=str 
        df[c] = np.where(df[c].str.contains("20"), df[c].str[:10], df[c])
    

    【讨论】:

      【解决方案2】:

      IIUC:

      您希望对整个数据框执行此操作。
      如果是这样,这是一种在整个数据帧上同时使用numpy 的矢量化方式。

      设置

      df = pd.DataFrame([
          ['xxxxxxxx20yyyy', 'z' * 14, 'wwwwwwww20vvvv'],
          ['k' * 14, 'dddddddd20ffff', 'a' * 14]
      ], columns=list('ABC'))
      
      df
      
                      A               B               C
      0  xxxxxxxx20yyyy  zzzzzzzzzzzzzz  wwwwwwww20vvvv
      1  kkkkkkkkkkkkkk  dddddddd20ffff  aaaaaaaaaaaaaa
      

      解决方案
      使用numpy.core.defchararray.findnp.where

      from numpy.core.defchararray import find
      
      v = df.values.astype(str)
      i, j = np.where(find(v, '20') > -1)
      
      v[i, j] = v[i, j].astype('<U10')
      
      df.loc[:] = v
      
      df
      
                      A               B               C
      0      xxxxxxxx20  zzzzzzzzzzzzzz      wwwwwwww20
      1  kkkkkkkkkkkkkk      dddddddd20  aaaaaaaaaaaaaa
      

      如果不想覆盖旧数据框,可以新建一个:

      pd.DataFrame(v, df.index, df.columns)
      
                      A               B               C
      0      xxxxxxxx20  zzzzzzzzzzzzzz      wwwwwwww20
      1  kkkkkkkkkkkkkk      dddddddd20  aaaaaaaaaaaaaa
      

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 2013-08-20
        • 1970-01-01
        • 2020-11-12
        • 2020-12-23
        • 2020-10-12
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        相关资源
        最近更新 更多