подсчитывать количество строк в фрейме данных с условиями

#python #dataframe

#python #фрейм данных

Вопрос:

У меня есть некоторые проблемы в коде, где я хочу заполнить фрейм данных, в зависимости от другого. Чтобы объяснить, в фрейме данных у меня есть замены компонентов, классифицированных кодами, чтобы узнать их конкретные места размещения. Я хочу иметь возможность подсчитать, сколько у меня замен, и поместить это число в другой фрейм данных. эта часть моего кода выглядит так:

 import plotly.express as px

import pandas as pd

import numpy as np

#import excel from database

d=pd.read_excel("replacements.xlsx")
df=pd.DataFrame(d)
  

#мы создаем 3 фрейма данных, чтобы указать соответственно количество замен, проценты и частоту отказов.Здесь мы сосредоточимся на количестве замен, потому что это будет другой процесс для заполнения остальных.

 tab_nb_replacements=pd.DataFrame(columns=['electrical auxiliary power supply','process monitoring','wind turbine system','generator system','transmission of electrical energy','structures connected to production','auxiliary systems'], index=['falaise_nb_replacements',...,'quittebeuf_nb_replacements])
  

Как вы можете видеть, представлены только некоторые значения. Ниже я заполняю нулем весь индекс ‘falaise_nb_replacements’ с 0 (я сделал это также для всех индексов).

 tab_nb_replacements['electrical auxiliary power supply']['falaise_nb_replacements']=0
tab_nb_replacements['process monitoring']['falaise_nb_replacements']=0
tab_nb_replacements['wind turbine system']['falaise_nb_replacements']=0
tab_nb_replacements['generator system']['falaise_nb_replacements']=0
tab_nb_replacements['transmission of electrical energy']['falaise_nb_replacements']=0
tab_nb_replacements['structures connected to production']['falaise_nb_replacements']=0
tab_nb_replacements['auxiliary systems']['falaise_nb_replacements']=0
  

########### Я пробовал разные способы получения количества замен ######

##ПРИМЕЧАНИЕ: для falaise сайта мы хотим выбрать lign, когда значение в столбце ‘RDSPP code’ начинается с ‘B’ и когда значение в столбце ‘WTName’ равно ‘Falaise’.

##первый метод

 tab_nb_replacements['electrical auxiliary power supply']['falaise_nb_replacements']=np.where(((df['RDSPP code'].str[:1]=='B') amp; (df['WTName']=='Falaise')),tab_nb_replacements['electrical auxiliary power supply']['falaise_nb_replacements'] 1,tab_nb_replacements['electrical auxiliary power supply']['falaise_nb_replacements'])
  

#второй метод

 df.loc[(df['RDSPP code'].str[:1]=='B') and (df['WTName']=='Falaise'),tab_nb_replacements['electrical auxiliary power supply']['falaise_nb_replacements']] = tab_nb_replacements['electrical auxiliary power supply']['falaise_nb_replacements'] 1 
  

#третий метод

 tab_nb_replacements['electrical auxiliary power supply']['falaise_nb_replacements']=(df[df['RDSPP code'].str[:1]=='B' and df['WTName']=='Falaise']).count()
  

Любой из этих методов дал мне результаты. Действительно, с помощью этих методов я получаю:

 "ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."
  

Если у кого-нибудь есть решение или какие-то советы по нему, это будет действительно полезно!

Лучшие,

Ответ №1:

Для третьего метода, который вы упомянули, df['WTName']=='Falaise' выдаст ошибку, потому что df['WTName'] тип данных pandas.series , и вы не можете сравнить его с string . Поэтому вы должны преобразовать его в строку, как показано ниже:

 df['WTName'].astype(str) == 'Falaise'
  

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

1. Привет, я попробовал, как вы предлагали, третий метод, который дал мне: tab_nb_replacements[‘вспомогательный источник питания’][‘falaise_nb_replacements’]=(df[df[‘код RDSPP’].str[:1]==’B’ и df[‘WTName’].astype(str)==’Falaise’]).count() но я все еще получаю ‘ ValueError: Значение истинности Ряда неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.all().»

2. Наконец, я получаю хорошие результаты, используя: dff=df.copy() mask=(dff[‘Site’].astype(str)==’Falaise’) amp; (dff[‘RDSPP code’].str[:1]==’B’) dff=dff[mask] tab_nb_replacements[‘вспомогательный источник питания’][‘falaise_nb_replacements’]=len(dff)

3. Я сделал для всех из них вручную (копирование мимо), и у меня хорошие результаты. Но мне не удалось сделать это с помощью цикла, например, создайте список со всеми столбцами имен фрейма данных и заполните результат следующим образом: для x в (LIST_name_column) dff=df.copy() mask=(dff[‘Site’].astype(str)==’Falaise’) amp; (dff[‘RDSPP code’].str[:1]==’B’) dff=dff[mask ] tab_nb_replacements[x][‘falaise_nb_replacements’]=len(dff) Этот метод не работает, у вас есть идея, как сделать это правильно и автоматически?

4. К сожалению, я не могу понять это таким образом.