首页 > 解决方案 > 根据列对数据框中的值求和

问题描述

假设我有以下数据框:

df = pd.DataFrame([[1, np.nan, 4, 5, 6, 7], [1, 3, 2, 1, np.nan, 8], [4, 6, 1, 1, 1, 4]], columns=['Student1', 'Student2', 'Student3', 'Exam1', 'Exam2', 'Exam3'])

>>> df
   Student1  Student2  Student3  Exam1  Exam2  Exam3
0         1       NaN         4      5    6.0      7
1         1       3.0         2      1    NaN      8
2         4       6.0         1      1    1.0      4

仅当特定列中的值不是 nan 时,我才想对学生和考试的单元格求和。例如,对于第一行,我只能对 Student1 和 Student3(结果列 student_sum)以及 Exam1 和 Exam3 求和,因为 Student2 是空的,所以也不考虑 Exam2。我尝试使用 itertuples 进行迭代,但问题是它总结了所有内容。

结果应该是:


   Student1  Student2  Student3  Exam1  Exam2  Exam3  Res_stud Res_exam
0         1       NaN         4      5    6.0      7         5       12
1         1       3.0         2      1    NaN      8         3       9
2         4       6.0         1      1    1.0      4        11       6

标签: pythonpandasdataframe

解决方案


另一种方式:

stu=df.filter(like='Student').columns
exam=df.filter(like='Exam').columns
#Grab Columns Name

最后将彼此相反的掩码传递给彼此:

df['Student_Sum']=df[stu].mask(df[exam].isna().values).sum(1)
df['Exam_Sum']=df[exam].mask(df[stu].isna().values).sum(1)

输出df

   Student1     Student2    Student3    Exam1   Exam2   Exam3   Student_Sum     Exam_Sum
0   1               NaN         4       5       6.0     7       5.0             12.0
1   1               3.0         2       1       NaN     8       3.0              9.0
2   4               6.0         1       1       1.0     4       11.0             6.0

推荐阅读