python - python - 如果列中的行包含某个字符串,则选择列

我能够使用for循环和series.str.contains方法来完成此操作,但是似乎并没有达到最佳效果,尤其是对于较大的数据集。有更有效的方法吗?


import pandas as pd



df = pd.DataFrame({'A': {0: '2019-06-01', 1: '2019-06-01', 2: '2019-06-01'},


 'B': {0: '10', 1: '20', 2: '30'},


 'C': {0: '10', 1: '20%', 2: '30%'},


 'D': {0: '10%', 1: '20%', 2: '30'},


 })



Dataframe


 A B C D


0 2019-06-01 10 10 10%


1 2019-06-01 20 20% 20%


2 2019-06-01 30 30% 30



当前方法


col_list = []


for col in df.columns:


 if (True in list(df[col].str.contains('%'))) is True:


 col_list.append(col)



输出

 
['C','D']



 

时间:

首先,对对象列过滤使用DataFrame.select_dtypes,这显然是字符串列。

然后使用DataFrame.applymap对元素检查值,如果每列至少有一列,则为DataFrame.any,所以可能的筛选列:


c = df.columns[df.select_dtypes(object).applymap(lambda x: '%' in str(x)).any()].tolist()


print (c)


['C', 'D']



或者使用Series.str.contains每一列,如果所有字符串列都被忽略,则应省略na参数:


f = lambda x: x.str.contains('%', na=False)


c = df.columns[df.select_dtypes(object).apply(f).any()].tolist()


print (c)


['C', 'D']




df.columns[df.stack().str.contains('%').any(level=1)]



Index(['C', 'D'], dtype='object')



推导


[c for c in df if df[c].str.contains('%').any()]



['C', 'D']



filter


[*filter(lambda c: df[c].str.contains('%').any(), df)]



['C', 'D']



Numpy的find


from numpy.core.defchararray import find



df.columns[(find(df.to_numpy().astype(str), '%') >= 0).any(0)]



Index(['C', 'D'], dtype='object')



尝试这个:


df.columns[df.apply(lambda x: x.str.contains("%")).any()]



replace比较,并且创建掩码以相应地索引列:


df.loc[:,(df != df.replace('%', '', regex=True)).any()]


 C D


0 10 10%


1 20% 20%


2 30% 30



df.columns[(df != df.replace('%', '', regex=True)).any()]


# Index(['C', 'D'], dtype='object')



用melt实现


df.melt().loc[lambda x :x.value.str.contains('%'),'variable'].unique()


Out[556]: array(['C', 'D'], dtype=object)



...