大熊猫将列值匹配到同一数据帧中的多个列

时间:2020-10-07 19:39:04

标签: python pandas dataframe

我有一个包含数千列的Pandas Dataframe。熊猫数据框的代码段通过以下方式表示:

    import numpy as np
    import pandas as pd
    DataFrame1=pd.DataFrame([ ['A1X1' , 'J1', 'Q4', 'ND', 'J1'],
                              ['A1X2' , 'X1', '01', 'Q2', 'JK'],
                              ['A1X3' , 'R6', 'R6', '01', 'A5'],
                              ['A1X4' , 'J1', 'R6', 'A5', 'B6']],
                            columns=['ID', 'SearchValue', 'Check 1', 'Check 2', 'Check 60000'])
    DataFrame1.head(4)

DataFrame1-IMAGE1

我试图简明地确定'SearchValue'是否在'Check1','Check2'和其他所有列中,直到'Check 60000',如果确实存在,则在新的'FinalResult中返回'SearchValue' '列,如果为false,则默认为'XX'。

我知道我可以利用类似下面的代码的方式来完成此任务,但是我需要将代码写出 60,000次以覆盖所有列。考虑到实际DataFrame中存在的其他“ SearchValue”列的数量,这些列可能很快将程序推入数百万行代码中,因此这是完全不可接受的。有没有更好的方法可以做到这一点?

    Condition=[
               DataFrame1['SearchValue'] .eq (DataFrame1 [ 'Check 1' ]) 
               | DataFrame1['SearchValue'] .eq (DataFrame1 [ 'Check 2' ]) 
               | DataFrame1['SearchValue'] .eq (DataFrame1 [ 'Check 60000' ]) 
              ]
    Choice=[ 
            DataFrame1['SearchValue']
           ]
    DataFrame1['FinalResult']=numpy.select(Condition,Choice,default='XX')
         
    DataFrame1.head(4)

DataFrame1-IMAGE2

谢谢!

3 个答案:

答案 0 :(得分:3)

# create a mask using isin and any
mask = DataFrame1[DataFrame1.columns[2:]].isin(DataFrame1['SearchValue']).any(1)
# use numpy.where to assign values
DataFrame1['FinalResult'] = np.where(mask, DataFrame1['SearchValue'], 'XX')

     ID SearchValue Check 1 Check 2 Check 60000 FinalResult
0  A1X1          J1      Q4      ND          J1          J1
1  A1X2          X1      01      Q2          JK          XX
2  A1X3          R6      R6      01          A5          R6
3  A1X4          J1      R6      A5          B6          XX

答案 1 :(得分:0)

我会进入麻木的世界并进行比较:

              Name  Department  ... Call Duration        ITT
              Mark         21  ...       0.01178         NO
              Mark         21  ...       0.01736        YES
              Mark         21  ...       0.01923         NO
              Mark         21  ...       0.00911  Follow up
              Mark         21  ...       0.01007        YES
              Mark         21  ...       0.01206        YES
              Mark         21  ...       0.01256         NO
              Mark         21  ...       0.01006  Follow up
              Mark         21  ...       0.01162        YES
              Mark         21  ...       0.00733        YES
              Mark         21  ...       0.01250         NO
              Mark         21  ...       0.01013        YES
              Mark         21  ...       0.01308        YES

[13 rows x 6 columns]

现在分配box = df.to_numpy() box array([['A1X1', 'J1', 'Q4', 'ND', 'J1'], ['A1X2', 'X1', '01', 'Q2', 'JK'], ['A1X3', 'R6', 'R6', '01', 'A5'], ['A1X4', 'J1', 'R6', 'A5', 'B6']], dtype=object) compare = box[:, 1, np.newaxis] == box[:, 2:]

numpy where

link很有帮助。

答案 2 :(得分:0)

您要搜索每一行中的值:

mask = DataFrame1.filter(like='Check').eq(DataFrame1['SearchValue'], axis=0).any(1)

DataFrame1['FinalResult'] = DataFrame1['SerchValue'].where(mask, 'XX')

输出:

     ID SearchValue Check 1 Check 2 Check 60000 FinalResult
0  A1X1          J1      Q4      ND          J1          J1
1  A1X2          X1      01      Q2          JK          XX
2  A1X3          R6      R6      01          A5          R6
3  A1X4          J1      R6      A5          B6          XX