使用np.where在值为数组的pandas单元格中匹配值(ValueError:数组的长度不同)

时间:2017-02-06 14:40:06

标签: python arrays pandas numpy dataframe

非常感谢你的阅读。

(先前的考虑:我不能改变数据框内数据的格式;我坚持使用我的内容。以下是我的数据和问题的简化版本)

我有一个包含以下格式的数据框:

2>nul

我想创建一个新列^,如果df = pd.DataFrame( {'Machine': [['red', 'blue'], ['red'], ['blue'], ['No Match']]}) Machine 0 [red, blue] 1 [red] 2 [blue] 3 [No Match] 中的值等于TF和{{{},{}返回给定行True 1}}否则。

Machine

要做到这一点,我可以写:

['No Match']

我得到了这个输出:

False

原因是numpy期望 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 作为值传递到df['Machine']语句中?

作为工作原理的一个例子,对于以下数据框,一切都按预期工作:

['No Match']

按预期工作:

['No match']

1 个答案:

答案 0 :(得分:2)

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

如果只需要Falsedf['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

但如果需要另外一些价值观:

list comprehension

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 的解决方案:

"Hello"