我有这个例子df:
df6 = pd.DataFrame({
'answer1': ['Lo', 'New York', 'Toronto'],
'answer2': ['London', 'New', 'Paris'],
'answer3': ['CA', 'CA', 'CA'],
'correct': [['London'], ['New York'], ['Toronto']]
})
df6
给出:
answer1 answer2 answer3 correct
0 Lo London CA [London]
1 New York New CA [New York]
2 Toronto Paris CA [Toronto]
我试图通过匹配str
格式的值来获得列名(答案1或2...等(,该列名包含名为Answer
的新列中正确列中的文本。正确的列具有列表类型中的数据
我使用了以下代码:
cols = df6.filter(like='answer').columns
df6['Answer'] = df6[cols].apply(lambda s: ', '.join(cols[(m:=[str(s[col]) in str(df6.loc[s.name, 'correct']) for col in cols])]) , axis=1)
但我去不准确的结果:
answer1 answer2 answer3 correct Answer
0 Lo London CA [London] answer1, answer2
1 New York New CA [New York] answer1, answer2
2 Toronto Paris CA [Toronto] answer1
应该是:
answer1 answer2 answer3 correct Answer
0 Lo London CA [London] answer2
1 New York New CA [New York] answer1
2 Toronto Paris CA [Toronto] answer1
如果我将in
更改为==
,代码将不起作用,因为数据类型不可比较(str与列表(,而且我需要将列表项包装在str
中,以避免在我的原始df中出现多个数据问题
我不知道如何做到这一点?
编辑:
因此,为了简短一点,对于这行代码:
df6['Answer'] = df6[cols].apply(lambda s: ', '.join(cols[(m:=[str(s[col]) in str(df6.loc[s.name, 'correct']) for col in cols])]) , axis=1)
上一行中的这个特定部分:
str(s[col]) in str(df6.loc[s.name, 'correct'])
我需要找到一种方法来检查完全匹配,以使用==
而不是in
。这就像在字符串列表中循环
我试着玩它,但没有结果:
str(s[col]) == [x for x in str(df6.loc[s.name, 'correct'])]
有什么想法吗?
去掉角括号,检查df中是否存在,然后有条件地复制到列上
df6['answer'] =df6.isin(df6['correct'].str[0].to_list()).agg(lambda s: s.index[s].values, axis=1)
df6
answer1 answer2 answer3 correct answer
0 Lo London CA [London] [answer2]
1 New York New CA [New York] [answer1]
2 Toronto Paris CA [Toronto] [answer1]
我认为您应该查看answer
列中的元素是否在列表中,而不是在字符串中,在correct
列中:
df6['Answer'] = df6[cols].apply(lambda s: ', '.join(cols[(m:=[str(s[col]) in list(df6.loc[s.name, 'correct']) for col in cols])]) , axis=1)
应该可以,因为这是检查answerX
元素是否在correct
列表中。