Я бы предложил здесь использовать метод isin () , а затем получить сумму.
data = [['John',"ba"],['Harry',"ms"],['Bill',"phd"],['Mary', 'bachelors']]
df = pd.DataFrame(data,columns=['name','description'])
degree_level = {
'level_1':{'bachelors','bachelor','ba'},
'level_2':{'masters','ms','m.s',"master's",'master of science'},
'level_3':{'phd','p.h.d'}
}
results = {}
for level, values in degree_level:
results[level] = data_scientist_filtered['description'].isin(values).sum()
print(results)
#{"level_1": 2, "level_2": 1, "level_3": 1}
Редактировать Цикл for можно заменить напонимание, только к вашему сведению.
def num_of_degrees(degrees):
return data_scientist_filtered['description'].isin(values).sum()
results = {level: num_of_degrees(values) for level, values in degree_level}
Edit 2
Когда вы показываете, как выглядит df, теперь я вижу, в чем проблема.Вам нужно filter () df
, затем получить count()
.
#just cleaning some unnessecary values from degrees_level
degree_level = {
'level_1':{'bachelor',' ba '},
'level_2':{'masters',' ms ',' m.s ',"master's"},
'level_3':{'phd','p.h.d'}}
results = {}
for level, values in degree_level:
results[level] = df.query(' or '.join((f"column_name.str.contains({value})" for value in values)), case=False, engine='python').count()
Что-то подобное должно работать