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
stack 与 anydf.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)
findfrom 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)
首先DataFrame.select_dtypes用于仅过滤对象列,显然是字符串列。
然后DataFrame.applymap对DataFrame.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)
尝试这个:
df.columns[df.apply(lambda x: x.str.contains("\%")).any()]
Run Code Online (Sandbox Code Playgroud)
与比较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。
让我们做 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)