非常感谢您的阅读。
(事先考虑:我无法更改数据帧内数据的格式;我坚持我所拥有的。以下是我的数据和问题的简化和简化版本)
我有一个具有以下形式的数据框:
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
关于python - 使用 np.where 匹配 pandas 单元格中的值,其中值是数组(ValueError : Arrays were different lengths),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42070410/