Как мне создать список столбцов, которые содержат указанные строки в своих строках? - PullRequest
2 голосов
/ 19 июня 2019

У меня есть датафрейм с сотнями столбцов, я хочу вернуть набор столбцов, которые содержат только строки true / false.

т.е.

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

Myданные очень большие, есть ли способ оптимизировать этот поиск?

Ответы [ 2 ]

3 голосов
/ 19 июня 2019

Вы можете использовать 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 голос
/ 19 июня 2019

Чтобы завершить ответ от 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
...