счетчики python pandas с использованием нескольких критериев И нескольких фреймов данных

Попытка создать - в Python с использованием нескольких фреймов данных - эквивалент countifs в Excel, который охватывал бы несколько листов.

Мне нужно новое количество столбцов записей в другом фрейме данных на основе критериев из текущего фрейма данных.

См. впечатление в Excel о том, что я хочу делать в Python, а также здесь.

Моя цель?

  • Подсчет экзаменов во фрейме данных студентов
  • по студенческому билету
  • с датой экзамена> = дата зачисления
  • с датой экзамена ‹= подробная дата
  • с оценкой за экзамен> = 70

По сути, эквивалент в Excel был бы ...

= COUNTIFS (Сводка! $ B $ 1: $ B $ 11, "> =" & Подробности! B2, Сводка! $ B $ 1: $ B $ 11, "‹ = "& Подробности! C2, Сводка! $ C $ 1: $ C $ 11," > = "& 70, Резюме! $ A $ 1: $ A $ 11," = "& Подробнее! A2)

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

Нашел эти ответы в своем исследовании:

Не совсем то, что я ищу, потому что они не охватывают несколько фреймов данных. Мне удалось создать базовые счетчики для единственного фрейма данных:

sum(1 for x in students['Student ID'] if x == 1)
sum(1 for x in exams['Exam Grade'] if x >= 70)

person Joel Underwood    schedule 27.10.2016    source источник


Ответы (1)


По сути, вам нужно настроить два фрейма данных, скажем df1 для информации о "сданных экзаменах" и df2 для оценок за каждый экзамен.

Для начала вы можете прочитать в своих файлах Excel вот что:

df1 = pd.read_excel('filename1.xlsx')
df2 = pd.read_excel('filename2.xlsx')

Затем для каждой строки в df1 вы хотите сегментировать df2 и получить длину сегментированного фрейма данных.

Хотя сначала вы можете захотеть составить список информации для каждой строки в df1, что можно сделать следующим образом:

student_info = df1[['Student ID', 'Enrollment Date', 'Qualification Date']].values

Затем вы можете перебирать строки следующим образом:

N_exams_passed = [] # Store counts for each student in a list

for s_id, s_enroll, s_qual in student_info:
    N_exams_passed.append(len(df2[(df2['Student ID']==s_id) &
                                  (df2['Exam Date']>=s_enroll) &
                                  (df2['Exam Date']<=s_qual) &
                                  (df2['Grade']>=70)])
                          )

Затем добавьте / замените столбец в df1:

df1['Exams Passed'] = N_exams_passed

Чтобы правильно сравнить даты, вам нужно будет преобразовать их в объекты datetime в каждом фрейме данных pandas, и я оставлю это на ваше усмотрение. Подсказка: вы можете использовать функцию pd.to_datetime().

person AlexG    schedule 27.10.2016
comment
это работает, спасибо. Никогда бы до этого не дошел. Крутая кривая обучения по сравнению с Excel. - person Joel Underwood; 27.10.2016