减少匹配的多个np.where

时间:2019-11-14 05:10:11

标签: python pandas numpy

我必须创建一列Result,根据匹配条件,输出将是以下3列code1code2code3之一。 / p>

我用np.where创建了以下语句:

df['Result'] =  np.where((df.code == 'BTB.JPWK'), df.code_1, 
                np.where((df.code == 'BTB.JP'), df.code_2, 
                np.where((df.code == 'BTB.'), df.code_3, '1')))

但是结果中填充的输出不正确。无论条件匹配如何,它总是在完整迭代中填充1,这是错误条件。

我认为我缺少正确的输出,因为在某些情况下df.code将匹配所有3个条件,但是我只需要选择大多数数字都匹配的最佳匹配条件即可。

我有一个庞大的data-set,因此试图找到一种更简单的方法来正确地填充结果列而不会花费太多时间。

================================================ ==========================

应用@AkshayNevrekar的解决方案后,我尝试执行修改:

我尝试了以下方法:

mask1 = [df.Cluster == 'Japan' , df.code_4 == 'BTB.JPWK']
mask2 = [df.Cluster == 'Japan' , df.code_5 == 'BTB.JP']
mask3 = [df.Cluster == 'Japan' , df.code_6 == 'BTB.']
mask4 = [df.Cluster == 'Japan' , df.code != 'BTB.']

df['Result'] = np.select([mask1, mask2, mask3, mask4],[df.code_1, df.code_2, df.code_3, df.code])

我在这里遇到值错误:

ValueError: Length of values does not match length of index

数据帧如下:

Cluster code    Result
Japan   BTB.JP828802    828802
Japan   BTB.JP828804    828804
Japan   BTB.JP828806    828806
Japan   BTB.JPNS9002    NS9002
Japan   040615  040615
Japan   BTB.JP823045    823045
Japan   BTB.JPNS9001    NS9001
Japan   BTB.JPWK821517  821517

1 个答案:

答案 0 :(得分:2)

如果您有多种情况,请使用np.select代替np.where

mask1 = df.code == 'BTB.JPWK'
mask2 = df.code == 'BTB.JP'
mask3 = df.code == 'BTB.'

df['Result'] = np.select([mask1, mask2, mask3],[df.code_1, df.code_2, df.code_3], 1)