Str 和字符串列表之间"=="运算符的精确匹配字符串



我有这个例子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列表中。

最新更新