Поиск оставшихся строк в датафреймах pandas

Вопрос или проблема

Поиск оставшихся строк в датафреймах pandas

Если я определяю Y в определенных столбцах, используя это:

thing1 = df[df['column1'] == 'Y']

thing2 = df[df['column2'] == 'Y']

thing3 = df[df['column3'] == 'Y']

thing4 = df[df['column4'] == 'Y']

Как я могу получить все строки, в которых нет Y в одном из этих столбцов? Я пробовал что-то вроде:

none_of_the_things = df[(df['column1'] != 'Y') & (df['column2'] != 'Y') & (df['column3'] != 'Y') & (df['column4'] != 'Y')]

но это не работает. С вот такой ошибкой:

numpy.core._exceptions._ArrayMemoryError: Не удается выделить 23,3 TiB для массива с формой (1855862, 1724897) и типом данных float64
python ./deepseek-v2.5-chart.py  11.91s user 2.81s system 105% cpu 13.996 total

Я создал какой-то монстр с помощью этого метода? 23,3 TiB звучит как много.

пример csv:

RECVDATE,column1,column2,column3,column4
01/01/2024,Y,N,N,N
01/04/2024,N,N,N,N
02/02/2024,N,Y,N,N
02/02/2024,N,Y,N,N
02/04/2024,N,N,N,N
03/03/2024,N,N,Y,N
03/03/2024,N,N,Y,N
03/03/2024,N,N,Y,N
03/04/2024,N,N,N,N
04/04/2024,N,N,N,Y
04/04/2024,N,N,N,Y
04/04/2024,N,N,N,Y
04/04/2024,N,N,N,Y
04/04/2024,N,N,N,Y
04/04/2024,N,N,N,Y
04/04/2024,N,N,N,N
04/04/2024,N,N,N,N

пример python с закомментированным неработающим кодом:

#!/usr/bin env python3
date_field = 'RECVDATE'
import glob, os
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
dir_path="data"
dfs = [pd.read_csv(f, encoding='latin-1', low_memory=False, quotechar=""") for f in glob.glob(os.path.join(dir_path, 'example.csv'))]
df = pd.concat(dfs, axis=0, ignore_index=True)
df[date_field] = pd.to_datetime(df[date_field], errors="coerce")

thing1 = df[df['column1'] == 'Y']
thing1['YearMonth'] = thing1[date_field].dt.to_period('M')
monthly_counts1 = thing1.groupby('YearMonth').size()
monthly_counts1.index = monthly_counts1.index.astype(str)

thing2 = df[df['column2'] == 'Y']
thing2['YearMonth'] = thing2[date_field].dt.to_period('M')
monthly_counts2 = thing2.groupby('YearMonth').size()
monthly_counts2.index = monthly_counts2.index.astype(str)

thing3 = df[df['column3'] == 'Y']
thing3['YearMonth'] = thing3[date_field].dt.to_period('M')
monthly_counts3 = thing3.groupby('YearMonth').size()
monthly_counts3.index = monthly_counts3.index.astype(str)

thing4 = df[df['column4'] == 'Y']
thing4['YearMonth'] = thing4[date_field].dt.to_period('M')
monthly_counts4 = thing4.groupby('YearMonth').size()
monthly_counts4.index = monthly_counts4.index.astype(str)

# none_of_the_things = df[(df['column1'] != 'Y') & (df['column2'] != 'Y') & (df['column3'] != 'Y') & (df['column4'] != 'Y')]
# none_of_the_things['YearMonth'] = none_of_the_things[date_field].dt.to_period('M')
# non_monthly_counts = none_of_the_things.groupby('YearMonth').size()
# non_monthly_counts.index = non_monthly_counts.index.astype(str)

# Построение графиков
plt.figure(figsize=(12, 6))
monthly_counts1.plot(kind='line', marker="o", label="count1", color="red")
monthly_counts2.plot(kind='line', marker="o", label="count2", color="blue")
monthly_counts3.plot(kind='line', marker="o", label="count3", color="green")
monthly_counts4.plot(kind='line', marker="o", label="count4", color="purple")
# non_monthly_counts.plot(kind='line', marker="o", label="none", color="black")
plt.title('Количество случаев смерти/угроза жизни/госпитализации за месяц')
plt.xlabel('Месяц')
plt.ylabel('Количество')
plt.grid(True)
plt.xticks(rotation=45)
plt.legend(title="Легенда", loc="upper left")
plt.show()

Ответ или решение

Для нахождения строк в DataFrame, которые не содержат ‘Y’ в указанностях столбцах, вы можете использовать метод, основанный на логических операциях для фильтрации данных. Ошибка, которую вы получаете, вызвана неправильным использованием синтаксиса при фильтрации. Вот правильный способ сделать это:

Решение

Используйте логическое И (and), чтобы соединить условия для всех четырех столбцов. Правильный код будет выглядеть так:

import pandas as pd

# Загрузка данных из CSV файла
file_path = 'data/example.csv'
df = pd.read_csv(file_path, encoding='latin-1', low_memory=False)

# Преобразование даты
date_field = 'RECVDATE'
df[date_field] = pd.to_datetime(df[date_field], errors="coerce")

# Фильтрация строк, где в указанных столбцах нет 'Y'
none_of_the_things = df[(df['column1'] != 'Y') & 
                         (df['column2'] != 'Y') & 
                         (df['column3'] != 'Y') & 
                         (df['column4'] != 'Y')]

# Добавление колонки для группировки по месяцам
none_of_the_things['YearMonth'] = none_of_the_things[date_field].dt.to_period('M')

# Подсчет количества строк по месяцам
non_monthly_counts = none_of_the_things.groupby('YearMonth').size()
non_monthly_counts.index = non_monthly_counts.index.astype(str)

# Вывод результатов
print(none_of_the_things)
print(non_monthly_counts)

Пояснения:

  1. Чтение данных: Мы загружаем данные из CSV файла в DataFrame.
  2. Преобразование даты: С помощью pd.to_datetime преобразуем строки с датами в формат datetime.
  3. Фильтрация: Используем логические операторы (& для И) для создания общего условия: строка должна соответствовать всем условиям – в каждом из столбцов не должно быть ‘Y’.
  4. Группировка по месяцам: После того как мы получили строки без ‘Y’, мы добавляем новую колонку YearMonth для группировки данных по месяцам.
  5. Подсчет количества: Мы используем метод groupby для подсчета строк в каждом месяце и выводим результаты.

Теперь ваш код не должен вызывать ошибки, и вы сможете получить все строки, которые не содержат ‘Y’ в указанных столбцах.

Оцените материал
Добавить комментарий

Капча загружается...