非常感谢您的阅读。
(事先考虑:我无法更改数据框中数据的格式;我坚持使用现有的内容。以下是我的数据和问题的简化和简化版本)
我有一个具有以下形式的数据框:
df = pd.DataFrame(
{'Machine': [['red', 'blue'], ['red'], ['blue'], ['No Match']]})
Machine
0 [red, blue]
1 [red]
2 [blue]
3 [No Match]
我想创建一个新列 TF
,如果 Machine
中的值相等,它会为给定行返回 True
为 ['No Match']
否则为 False
。
Machine TF
0 [red, blue] False
1 [red] False
2 [blue] False
3 [No Match] True
为此,我可以写:
df['TF'] = np.where(df['Machine'] == ['No Match'],True, False)
我得到这个输出:
ValueError: Arrays were different lengths: 4 vs 1
这样做的原因是 numpy 期望 df['Machine']
和 ['No Match']
的长度相等,或者对于右边的标准成为一个简单的字符串/值。
如何调整此表达式以将数组 ['No match']
作为值成功传递到 np.where()
语句中?
作为工作原理的示例,对于以下数据框,一切都按预期工作:
df1 = pd.DataFrame(
{'Machine': [['red', 'blue'], ['red'], ['blue'], 'No Match']})
df1['TF'] = np.where(df1['Machine'] == 'No Match',True, False)
按预期工作:
Machine TF
0 [red, blue] False
1 [red] False
2 [blue] False
3 No Match True
请您参考如下方法:
您需要使用 ==
apply
来检查 list
中的值:
df['TF'] = np.where(df['Machine'].apply(lambda x: ['No Match'] == x),True, False)
print (df)
Machine TF
0 [red, blue] False
1 [red] False
2 [blue] False
3 [No Match] True
如果只需要 True
和 False
则更简单:
df['TF'] = df['Machine'].apply(lambda x: ['No Match'] == x)
print (df)
Machine TF
0 [red, blue] False
1 [red] False
2 [blue] False
3 [No Match] True
但如果需要一些其他值:
df['TF'] = np.where(df['Machine'].apply(lambda x: ['No Match'] == x),'a', 'b')
print (df)
Machine TF
0 [red, blue] b
1 [red] b
2 [blue] b
3 [No Match] a
列表理解
的解决方案:
df['TF'] = [['No Match'] == x for x in df['Machine']]
print (df)
Machine TF
0 [red, blue] False
1 [red] False
2 [blue] False
3 [No Match] True