Skip to main content
 首页 » 编程设计

python之使用 np.where (ValueError : Arrays were different lengths)

2024年10月01日7arxive

非常感谢您的阅读。

(事先考虑:我无法更改数据框中数据的格式;我坚持使用现有的内容。以下是我的数据和问题的简化和简化版本)

我有一个具有以下形式的数据框:

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 

如果只需要 TrueFalse 则更简单:

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