我有 2 个数据框df = pd.DataFrame({'Question': ['Q1', 'Q2', 'Q3'], 'Category' : ["Problem", "Problem", "Problem"], 'ScoreTruth' : [2, 9, 3], 'ScoreFalse' :[0,0,0]} ) Question Category ScoreTruth ScoreFalse0 Q1 Problem 2 01 Q2 Problem 9 02 Q3 Problem 3 0dfTotal = pd.DataFrame({'Name' : ['person1', 'person2','person3'], "Q1": ["TRUE","TRUE","TRUE"] ,"Q2" : ["TRUE","FALSE",np.nan], "Q3": [np.nan,"FALSE",np.nan]}) Name Q1 Q2 Q30 person1 TRUE TRUE NaN1 person2 TRUE FALSE FALSE2 person3 TRUE NaN NaN我想要两个dfTotal基于分数的新列df“Total Applicable”-> 每dfTotal行中所有得分值 (TRUE/FALSE) 的总和(忽略 NaN 值得分)以及基于dfQ1、Q2、Q3 的匹配值,即 row0 = 2+9 = 11、row1 = 2+ 9+3 = 14,行2 = 2“Total Truth” -> 一行中所有 TRUE 得分值的总和(从 中提取的得分df)我设法得到了第二个有点完整的结果,dfTotal['Total Truth'] = [x for x in np.sum(dfTotal.values == "TRUE", 1)]但这并没有考虑到“ScoreTruth”值df Name Q1 Q2 Q3 Total Truth0 person1 TRUE TRUE NaN 21 person2 TRUE FALSE FALSE 12 person3 TRUE NaN NaN 1我如何考虑将dfTotal "Q1", "Q2", "Q3"值为“TRUE”的列与 Q1、Q2、Q3 中各自的索引相匹配的 ScoreTruth 值df,然后提取这些分数并对它们求和?我想要这样的输出 Name Q1 Q2 Q3 Total Applicable Total Truth0 person1 TRUE TRUE NaN 11 111 person2 TRUE FALSE FALSE 14 22 person3 TRUE NaN NaN 2 2np.where()唯一的区别是我想对行值进行求和,而不是将 TRUE/FALSE 值设置为分数。
1 回答
弑天下
TA贡献1818条经验 获得超8个赞
您基本上正在研究矩阵乘法,您希望将问题的分数与 或非 相'TRUE'匹配NaN。所以:
scores = df.set_index('Question')['ScoreTruth']
questions = dfTotal[['Q1','Q2','Q3']]
dfTotal['Total Applicable'] = questions.notna() @ scores
dfTotal['Total Truth'] = questions.eq('TRUE') @ scores
输出:
Name Q1 Q2 Q3 Total Applicable Total Truth
0 person1 TRUE TRUE NaN 11 11
1 person2 TRUE FALSE FALSE 14 2
2 person3 TRUE NaN NaN 2 2
添加回答
举报
0/150
提交
取消