我有一个包含数千列的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)
我试图简明地确定'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)
谢谢!
答案 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