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