python pandas countifs使用多个标准和多个数据框

时间:2016-10-27 16:47:33

标签: python excel pandas formulas

尝试使用多个数据框在Python中创建 - 相当于Excel中可以跨越多个工作表的countifs。

我需要根据当前数据框中的条件,在其他数据框上新记录列数。

请参阅我在python中想要做的Excel impressionhere

我的目标?

  • 计算学生数据框中的考试
  • 按学生证
  • 考试日期> =注册日期
  • 考试日期< =详细日期
  • 考试成绩> = 70

基本上Excel等价物是......

  

= COUNTIFS(摘要!$ B $ 1:$ B $ 11,"> ="& Detail!B2,                              总结!$ B $ 1:$ B $ 11,"< ="& Detail!C2,                              总结!$ C $ 1:$ C $ 11,"> ="& 70,                              摘要!$ A $ 1:$ A $ 11," ="& Detail!A2)

...其中Summary是主要数据框,Detail是我要计算记录的辅助数据框。

在我的研究中找到了这些答案:

不是我想要的,因为它们不会跨越多个数据帧。我能够为单数数据框创建基本的标识:

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

1 个答案:

答案 0 :(得分:0)

基本上你要做的就是设置两个数据帧,比如说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

为了正确比较日期,您需要将它们转换为每个pandas数据帧中的datetime对象,我将把它留给您。提示:您可以使用pd.to_datetime()功能。