Excel Pandas Python вопрос по IndexingError, может искать и удалять столбцы штрафа, содержащие определенные слова, но не строки - PullRequest
0 голосов
/ 06 декабря 2018

Я использую этот код

    searchfor = ["s", 'John']
df = df[~df.iloc[1].astype(str).str.contains('|'.join(searchfor),na=False)]

Это возвращает ошибку

IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match

Однако это работает нормально, если запустить поиск по столбцу

df = df[~df.iloc[;,1].astype(str).str.contains('|'.join(searchfor),na=False)]

Iпытаюсь удалить строку на основании того, содержит ли строка определенную фразу

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Для удаления строк

Создайте маску, которая возвращает True или False в зависимости от того, содержит ли эта ячейка ваши строки

search_for = ["s", "John"]
mask = data.applymap(lambda x: any(s in str(x) for s in search_for))

Затем используйте фильтр .any для проверкипо крайней мере, одно значение True на строку с логическим индексированием и принимать только те строки, где True не найдено.

df_filtered = df[~mask.any(axis=1)]

Для удаления столбцов

search_for = ["s", "John"]
mask = data.applymap(lambda x: any(s in str(x) for s in search_for))

axis = 0вместо 1, чтобы проверить для каждого столбца:

columns_analysis = mask.any(axis=0)

получить индексы, когда True для сброса

columns_to_drop = columns_analysis[columns_analysis == True].index.tolist()
df_filtered = data.drop(columns_to_drop, axis=1)
0 голосов
/ 06 декабря 2018

Это связано с тем, как вы разделяете свои данные.В первом утверждении вы просите python разделить ваш фрейм данных и дать вам вторую (индекс 1 - вторая, если вы хотите сначала изменить индекс на 0), в то время как во втором случае вы запрашиваете второй столбец и в своемЭти данные имеют разную длину (моя ошибка, это формы).Посмотрите этот пример:

d = {'col1': [1, 2], 'col2': [3, 4], 'col3':[23,23]}
df = pd.DataFrame(data=d)
print(df)

col1    col2    col3
    1   3   23
    2   4   23

Первая строка:

df.iloc[0]
col1     1
col2     3
col3    23
Name: 0, dtype: int64

Первый столбец:

df.iloc[:,]
    1
    2
Name: col2, dtype: int64

Попробуйте, и если вам нравится ответ, проголосуйте ... Хорошоудачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...