【问题标题】:filter pandas column only for string containing rows仅针对包含行的字符串过滤熊猫列
【发布时间】:2017-05-02 00:00:29
【问题描述】:

在读取和过滤一个 Excel 文件后,我最终得到了一个看起来像这样的 pandas 数据框。

Col1    Col2
afaf    abc 1
1512        
asda    cdd 2
adsd        

我正在尝试结束

Col1    Col2
afaf    abc1
asda    cdd2

我尝试df['Col2'].replace('',np.nan,inplace=True) 并在之后执行dropna 但没有被替换,所以我认为它无法替换,因为 column2 在这些空行中有多个空格。

我忘了提到我不能使用条,因为 Col2 字符串有空格,我需要保持不变。

有什么想法吗?

【问题讨论】:

  • 所以基本上过滤掉 Col2 中什么都没有的行或类似的东西?
  • 是的,这将是预期的结果:)

标签: string pandas filter


【解决方案1】:

我认为您可以使用boolean indexing 和条件来删除strip 的一些可能的空格,然后检查lenlength 是否不是0

print (df[df.Col2.str.strip().str.len() != 0])
   Col1   Col2
0  afaf  abc 1
2  asda  cdd 2

如果没有空格:

df[df.Col2.str.len() != 0]

【讨论】:

    【解决方案2】:

    您可以使用 pandas str.strip() 函数剥离列。这应该删除所有的空格。

    可能是这样的

    df['Col2'].str.strip().replace('',np.nan,inplace=True)
    

    所以使用 pipe 你可以接收非 nan 行

    df.iloc[df.pipe(lambda x:x['Col2'].str.strip().replace('',np.nan)).dropna().index]
    

    后一种更新的解决方案也适用于您的额外空白限制。但是,请注意,我在发布该约束之前使用了管道。

    现在,我会选择例如像 Jezrael 的解决方案,但制定为

    df[df['Col2'].str.strip() !='']
    

    我认为,这比使用 len 函数更清晰一些

    刚刚在一个非常小的数据帧上执行了一些基准测试。 PirSquared 解决方案最快,其次是 Jezrael 的解决方案,其次是我使用与“比较”的解决方案。最后一个地方是管道变体。

    【讨论】:

      【解决方案3】:

      使用str.match

      df[~df.Col2.str.match(r'^\s*$')]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-30
        • 2018-08-08
        • 1970-01-01
        • 2021-12-24
        • 2019-08-22
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        相关资源
        最近更新 更多