如何创建在行中包含指定字符串的列的列表?

时间:2019-06-19 14:44:47

标签: python pandas list dataframe subset

我有一个包含数百列的数据框,我想返回一组仅包含真/假字符串的列。

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

我的数据很大,有什么方法可以优化此搜索?

2 个答案:

答案 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