选择列(如果它们的任何行包含某个字符串)

MBa*_*ith 6 python dataframe pandas

我正在尝试获取DataFrame中的列列表,如果列中的任何值包含字符串。例如,在下面的数据框中,我想要一个字符串列表中包含%的列的列表。我可以使用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'},
               })
Run Code Online (Sandbox Code Playgroud)

数据框

            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
Run Code Online (Sandbox Code Playgroud)

当前方法

col_list = []
for col in df.columns:
    if (True in list(df[col].str.contains('%'))) is True:
        col_list.append(col)
Run Code Online (Sandbox Code Playgroud)

输出量

['C', 'D']
Run Code Online (Sandbox Code Playgroud)

piR*_*red 10

stackany

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

Index(['C', 'D'], dtype='object')
Run Code Online (Sandbox Code Playgroud)

理解

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

['C', 'D']
Run Code Online (Sandbox Code Playgroud)

filter

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

['C', 'D']
Run Code Online (Sandbox Code Playgroud)

脾气暴躁的 find

from numpy.core.defchararray import find

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

Index(['C', 'D'], dtype='object')
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 8

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

然后DataFrame.applymapDataFrame.any每列至少使用一个元素检查值,如果每列至少一个,则返回True,因此可能使用过滤器列:

c = df.columns[df.select_dtypes(object).applymap(lambda x: '%' in str(x)).any()].tolist()
print (c)
['C', 'D']
Run Code Online (Sandbox Code Playgroud)

或使用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']
Run Code Online (Sandbox Code Playgroud)


Qua*_*ang 6

尝试这个:

df.columns[df.apply(lambda x: x.str.contains("\%")).any()]
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 6

与比较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')
Run Code Online (Sandbox Code Playgroud)

这样避免了循环apply或的需要applymap


WeN*_*Ben 5

让我们做 melt

df.melt().loc[lambda x :x.value.str.contains('%'),'variable'].unique()
Out[556]: array(['C', 'D'], dtype=object)
Run Code Online (Sandbox Code Playgroud)