代码之家  ›  专栏  ›  技术社区  ›  00schneider

查找至少有一行包含字母的列

  •  4
  • 00schneider  · 技术社区  · 5 年前

    假设我有以下数据集:

    import pandas as pd
    
    df = pd.DataFrame(
            {'A': [1, 2, 3],
             'B': ['one', 2, 3],
             'C': [4, 5, '6Y']
             })
    

    我想知道-没有任何繁琐的for循环-哪些列包含至少一个字母的大小写(这里: B C

    谢谢你的帮助!

    3 回复  |  直到 5 年前
        1
  •  5
  •   cs95 abhishek58g    5 年前

    作为一个快速而简单的解决方案,您可以使用 replace 和过滤器:

    df.replace('(?i)[a-z]', '', regex=True).ne(df).any()
    
    A    False
    B     True
    C     True
    dtype: bool
    
    df.columns[df.replace('(?i)[a-z]', '', regex=True).ne(df).any()]
    # Index(['B', 'C'], dtype='object')
    

    str.contains 纵列:

    mask = df.astype(str).apply(
        lambda x: x.str.contains(r'[a-z]', flags=re.IGNORECASE)).any()
    mask
    
    A    False
    B     True
    C     True
    dtype: bool
    
    df.columns[mask]
    # Index(['B', 'C'], dtype='object')
    
        2
  •  5
  •   yatu Sayali Sonawane    5 年前

    我们可以利用 pd.to_numeric

    df.apply(pd.to_numeric, errors='coerce').isna().any().tolist()
    # [False, True, True]
    

    applymap 具有 str.isnumeric

    (~df.astype(str).applymap(str.isnumeric).all()).tolist()
    # [False, True, True]
    

        3
  •  3
  •   BENY    5 年前

    那样的话你可以 to_numeric

    df.apply(pd.to_numeric,errors='coerce').isnull().any()
    Out[37]: 
    A    False
    B     True
    C     True
    dtype: bool
    

    更新

    df.stack().str.contains('[a-zA-Z]').groupby(level=1).any()
    Out[62]: 
    A    False
    B     True
    C     True
    dtype: bool