我有一个包含数百列的数据框,我想返回一组仅包含真/假字符串的列。
即
a b c d e
true false 34 cat true
false false 16 dog true
true true 16 cow false
我希望返回['a','b','e']
我发现的所有堆栈溢出问题似乎都是在列标题而不是行值中搜索字符串。
一旦发现其中包含true / false的单个示例,则应将该列添加到列表中,但我警告我必须搜索整个数据帧,因为它可能包含多个NULL
我的数据很大,有什么方法可以优化此搜索?
答案 0 :(得分:3)
假设这些是字符串,则可以使用DataFrame.isin
:
df.columns[df.isin(['true', 'false']).all()]
# Index(['a', 'b', 'e'], dtype='object')
如果它们确实是布尔True / False值,则可以使用select_dtypes
df.infer_objects().select_dtypes(bool).columns
# Index(['a', 'b', 'e'], dtype='object')
或者,对dtypes
进行简单过滤:
df.columns[df.dtypes == bool]
# Index(['a', 'b', 'e'], dtype='object')
答案 1 :(得分:1)
要完成cs95中的答案。
另一种解决方案是查看一列中所有可能的值,并将此值集与要保留的值进行比较(“ true”,“ false”)。如您所见,在额外的f
列上,返回值为False
。
代码在这里:
# Import module
import pandas as pd
df = pd.DataFrame(
[["true", "false", 34, "cat", "true", "true"],
["false", "false", 16, "dog", "true","false"],
["true", "true", 16, "cow", "false", "Other"],
["false", "false", 16, "dog", "Other","false"]],
columns=["a", "b", "c", "d", "e", "f"]
)
# return if all values in the column are either "true" or "false"
def get_valid_column(col):
return set(col.unique()) == set(["true", "false"])
print(df.apply(get_valid_column))
# a True
# b True
# c False
# d False
# e True
# f False
# dtype: bool