Python 有没有比“更快捷的方法?”;至于;要比较列中的值以选择所需的值?

Python 有没有比“更快捷的方法?”;至于;要比较列中的值以选择所需的值?,python,pandas,Python,Pandas,我在一个数据框中有这两个不同的列。我想迭代并知道列'Entry\u Point'是否是Str,然后在Delivery\u Point中放入客户机编号 df Client_Num Entry_Point Delivery_Point 1 0 2 a 3 3 4 4 5

我在一个数据框中有这两个不同的列。我想迭代并知道列
'Entry\u Point'
是否是Str,然后在
Delivery\u Point
中放入
客户机编号

df
Client_Num     Entry_Point        Delivery_Point
1                      0
2                      a
3                      3
4                      4
5                      b
6                      c
8                      d
应该是这样的:

Client_Num     Entry_Point        Delivery_Point
1                     10                 10
2                      a                 2
3                      32                32
4                      14                14
5                      b                 5
6                      c                 6
8                      d                 8
我已经试着做了很多次了,但是时间太长了,特别是当我有2万行的时候

for i in range(len(df)):
   if  type(df.loc[i]['Entry_Point']) == str:
       df.loc[i]['Delivery_Point'] = df.loc[i]['Client_num']
   else:
       df.loc[i]['Delivery_Point'] = df.loc[i]['Entry_Point']

列将作为单个数据类型导入。因此,您应用的方法可能无法获取正确的结果。我想你应该做以下几点:

df['Delivery_Point'] = df.apply(lambda x: x.Client_num if not x.Entry_Point.strip().isnumeric() else x.Entry_Point, axis=1)

另一种可能在非常大的数据集上表现更好的方法是使用矢量化numpy函数:

将numpy导入为np
@矢量化
def get_if_str(客户端数量、入口点):
如果存在(入口点,str):
返回client_num
返回入口点
df['Delivery_Point']=get_if_str(df['Client_Num'],df['Entry_Point']))
我们可以在这里比较时间:


##慢行
def通用(df):
对于范围内的i(len(df)):
如果类型(df.loc[i]['Entry_Point'])==str:
df.loc[i]['Delivery\u Point']=df.loc[i]['Client\u Num']
其他:
df.loc[i]['交货点]]=df.loc[i]['入境点]]
%timeit通用(df)
#每个回路237 ms±5.88 ms(7次运行的平均值±标准偏差,每个回路1次)
#毫秒
%timeit df['Delivery_Point']=get_if_int(df['Client_Num'],df['Entry_Point']))
#每个回路185µs±1.38µs(7次运行的平均值±标准偏差,每个10000个回路)
#微秒
如您所见,使用Numpy矢量化函数可以获得可观的收益。更多关于它们的信息可以找到

编辑

如果您实际使用了值的numpy数组,那么应该可以从矢量化中获得更好的性能:

df['Delivery_Point']=get_if_str(df['Client_Num']值,df['Entry_Point']值)

让我们用pandas
来表示数字

df['New']=pd.to_numeric(df.Entry_Point,errors='coerce').fillna(df.Client_Num)
df
Out[22]: 
   Client_Num Entry_Point  New
0           1           0  0.0
1           2           a  2.0
2           3           3  3.0
3           4           4  4.0
4           5           b  5.0
5           6           c  6.0
6           8           d  8.0