Не удается подсчитать строки со специальным символом в dataframe

#python-3.x #pandas #dataframe

#python-3.x #pandas #dataframe

Вопрос:

Мой dataframe содержит 4 столбца. Я хочу подсчитать количество строк, в которых встречается значение ‘ N’. Все столбцы dataframe имеют dtype:objects. В приведенном ниже примере количество будет равно 1 (1 строка, где встречается N).

df.episode
введите описание изображения здесь

Это код, который не сработал:

 len(filter(lambda df: r'N' in str(df.episode), rows))

Output Error: NameError: name 'rows' is not defined
  

Как бы я определил строки? Я не уверен, к чему это относится.

Комментарии:

1. Что такое rows ? Существует ли он как объект? Вы также при работе с pandas и фреймами хотите избегать таких вещей, как len , filter и т.д… Я подозреваю, что вам нужно что-то вроде: df.eq(r'N').any(1).sum()

2. Спасибо вам за это. Теперь я получаю число с вашим кодом. Итак, ваш код в основном подсчитывает количество строк, в которых встречается N? Что именно означает .any(1)?

3. Кроме того, можно ли преобразовать значение N во всем dataframe с помощью np.Nan?

4. Вы загружаете файл из формата с разделителями? Если это так, то посмотрите на: na_values параметр для чего-то вроде: pandas.pydata.org/pandas-docs/stable/reference/api /…

5. Я пытаюсь найти для вас действительно хороший dupe, который, я уверен, охватывает все эти пункты … если нет — я напишу вам ответ, если хотите?

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее.

Сначала импортируйте numpy и pandas библиотеки.

 import pandas as pd
import numpy as np
  

Создайте dataframe сейчас, скопировал пример данных из post OP и выполнил следующую команду для создания df.

 df=pd.read_clipboard()
  

1-е решение: подсчитать строки для N вдохновения из комментариев @Jon Clements.

 df.eq(r'N').any(1).sum()
  

2-е решение: На ваш 2-й вопрос заменить N на NaN попробуйте следующее.

 df['seasonNumber']=np.where(df.seasonNumber=='\N',np.nan,df.seasonNumber)
df
  

Ответ №2:

Вы хотите фильтровать строки, ища столбцы, которые содержат символ N , который я предполагаю.

Если я посмотрю на ваш DataFrame , вы можете сделать следующее, чтобы вернуть строки, которые соответствуют:

 df[df.episodeNumber.str.contains(r'\N') | df.seasonNumber.str.contains(r'\N')]

    tconst      parentTconst    seasonNumber    episodeNumber
2   tt0042889   tt0989125       N              N
  

Чтобы подсчитать количество строк, соответствующих этому условию, вы можете использовать .shape или len()

 df[df.episodeNumber.str.contains(r'\N') | df.seasonNumber.str.contains(r'\N')].shape

len(df[df.episodeNumber.str.contains(r'\N') | df.seasonNumber.str.contains(r'\N')])

#Output
(1, 4)
1
  

Shape возвращает форму вашего фрейма данных, в данном случае (#rows, #columns)

Примечание перед N добавлением обратной косой черты, нам нужно буквально искать N , в этом случае только одна обратная косая черта будет функционировать как escape-символ, поэтому нам нужно добавить вторую, когда мы хотим точного совпадения.