Python数据框-使用基于现有列值长度的值创建一个新列

时间:2019-05-15 09:43:36

标签: python-3.x pandas numpy

我有一个如下数据框。

d = {'ID' : ['123456789012345678', '3456789012345678']
    }
df = pd.DataFrame(d)

,输出为

    ID
0   123456789012345678
1   3456789012345678

我想创建一个新列is_valid,使得如果ID value的长度为18,则true否则为false 也就是说,预期的输出是

            ID          is_valid
0   123456789012345678  Yes
1   3456789012345678    No

现在我使用正则表达式如下

expr = '^[0-9]{18}$'
df['is_valid'] = np.where(df['ID'].str.match(expr), 'Yes', 'No')

有没有更好的方法来实现它?

3 个答案:

答案 0 :(得分:2)

使用Series.str.lenSeries.eq

df['is_valid'] = df.ID.str.len().eq(18)

[出]

                   ID  is_valid
0  123456789012345678      True
1    3456789012345678     False

答案 1 :(得分:2)

您的代码:

 %timeit -n 1000
 expr = '^[0-9]{18}$'
 %timeit df['is_valid'] = np.where(df['ID'].str.match(expr), 'Yes', 'No')

#320 µs ± 7.97 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

其他替代方法:

%timeit -n 5000
%timeit df['validation']=['True' if len(s)>=18 else 'False' for s in df['ID']]

#201 µs ± 10.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

enter image description here

答案 2 :(得分:1)

您可以根据条件使用np.whereYesNo之间切换:

df['is_valid'] = np.where(df.ID.str.len().eq(18), 'Yes', 'No')
#                   ID is_valid
#0  123456789012345678      Yes
#1    3456789012345678       No