python pandas countifs 使用多个条件和多个数据框
python pandas countifs using multiple criteria AND multiple data frames
尝试创建——在 Python 中使用多个数据框——相当于 Excel 中跨越多个工作表的计数。
我需要根据当前数据框.[=18=的条件在另一个数据框上计算新的记录列数]
参见Excel impression of what I want to do in python, also here。
我的目标?
- 计算学生数据框
的考试
- 按学号
- 考试日期 >= 报名日期
- 考试日期 <= 详细日期
- 考试成绩 >= 70
基本上 Excel 等价物是...
=COUNTIFS(Summary!$B:$B, ">="&Detail!B2,
Summary!$B:$B, "<="&Detail!C2,
Summary!$C:$C, ">="&70,
Summary!$A:$A, "="&Detail!A2)
...其中 Summary 是主要数据框,Detail 是我要计算记录的辅助数据框。
在我的研究中找到了这些答案:
- sumifs function in python
- What is a good way to do countif in Python
- Python Pandas counting and summing specific conditions
不是我想要的,因为它们不跨越多个数据帧。我能够为 singular 数据框创建一个基本的计数:
sum(1 for x in students['Student ID'] if x == 1)
sum(1 for x in exams['Exam Grade'] if x >= 70)
基本上你要做的是设置两个数据框,df1
表示 "exams passed" 信息,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)])
)
然后 add/replace df1 中的列:
df1['Exams Passed'] = N_exams_passed
为了正确比较日期,您需要将它们转换为每个 pandas 数据框中的日期时间对象,我将把这个留给您。提示:您可以使用 pd.to_datetime()
函数。
尝试创建——在 Python 中使用多个数据框——相当于 Excel 中跨越多个工作表的计数。
我需要根据当前数据框.[=18=的条件在另一个数据框上计算新的记录列数]
参见Excel impression of what I want to do in python, also here。
我的目标?
- 计算学生数据框 的考试
- 按学号
- 考试日期 >= 报名日期
- 考试日期 <= 详细日期
- 考试成绩 >= 70
基本上 Excel 等价物是...
=COUNTIFS(Summary!$B:$B, ">="&Detail!B2, Summary!$B:$B, "<="&Detail!C2, Summary!$C:$C, ">="&70, Summary!$A:$A, "="&Detail!A2)
...其中 Summary 是主要数据框,Detail 是我要计算记录的辅助数据框。
在我的研究中找到了这些答案:
- sumifs function in python
- What is a good way to do countif in Python
- Python Pandas counting and summing specific conditions
不是我想要的,因为它们不跨越多个数据帧。我能够为 singular 数据框创建一个基本的计数:
sum(1 for x in students['Student ID'] if x == 1)
sum(1 for x in exams['Exam Grade'] if x >= 70)
基本上你要做的是设置两个数据框,df1
表示 "exams passed" 信息,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)])
)
然后 add/replace df1 中的列:
df1['Exams Passed'] = N_exams_passed
为了正确比较日期,您需要将它们转换为每个 pandas 数据框中的日期时间对象,我将把这个留给您。提示:您可以使用 pd.to_datetime()
函数。