仅识别数据框中列中的数值 - Python

我想要一个单独的列,如果“ID ”列包含所有数字值,则返回“是”;如果包含字母或字母数字值,则返回“否”。


ID      Result

3965      Yes

wyq8      No

RO_123    No

CMD_      No

2976      Yes


肥皂起泡泡
浏览 112回答 3
3回答

拉丁的传说

你可以pd.Series.str.isnumeric在这里使用。df['Result'] = np.where(df['ID'].str.isnumeric(), 'YES', 'NO')       ID Result0    3965    YES1    wyq8     NO2  RO_123     NO3    CMD_     NO4    2976    YESisnumeric使用它不能识别数字有一个警告float。test = pd.Series(["9.0", "9"])test.str.isnumeric()0    False1     Truedtype: bool如果您严格标记YESfor intthen 使用isnumericelse,您可以pd.Series.str.fullmatch在此处使用(从版本 1.1.0 开始)。df['Result'] = np.where(df['ID'].str.fullmatch(r"\d+|\d+\.\d+", 'YES', 'NO')对于版本<1.1.0,您使用re.fullmatchdf['Result'] = np.where(df['ID'].str.isnumeric(), 'YES', 'NO')       ID Result0    3965    YES1    wyq8     NO2  RO_123     NO3    CMD_     NO4    2976    YESisnumeric使用它不能识别数字有一个警告float。test = pd.Series(["9.0", "9"])test.str.isnumeric()0    False1     Truedtype: bool或者我们可以使用pd.to_numeric布尔掩码pd.Series.isnam = pd.to_numeric(df['ID'], errors='coerce').isna() df['Result'] = np.where(m, 'NO', 'YES')如果errors参数设置为'coerce'无法转换为数字的值,则值将设置为Nan。test = pd.Series(['3965', 'wyq8', 'RO_123', 'CMD_', '2976'])pd.to_numeric(test)0    3965.01       NaN2       NaN3       NaN4    2976.0Name: ID, dtype: float64或者您可以构建自定义函数def numeric(val):    try:        float(val)     # Using just `float` would suffice as int can be         return 'YES'   # converted to `float` so both `int`                       # and `float` wouldnot raise any error    except ValueError:        return 'NO'df['Result'] = df['ID'].apply(numeric)注意:float也处理科学记数法,float("1e6")-> 1000000.0。test = pd.Series(['1e6', '1', 'a 10', '1E6'])test.apply(numeric)0    YES1    YES2     NO3    YESdtype: object

FFIVE

检查是否ID包含non-digits并使用 反转布尔选择~。使用np.where, 分配选项df['Result']=np.where(~df.ID.str.contains('(\D+)'),'Yes','N0')&nbsp; &nbsp; &nbsp;ID Result0&nbsp; &nbsp; 3965&nbsp; &nbsp; Yes1&nbsp; &nbsp; wyq8&nbsp; &nbsp; &nbsp;N02&nbsp; RO_123&nbsp; &nbsp; &nbsp;N03&nbsp; &nbsp; CMD_&nbsp; &nbsp; &nbsp;N04&nbsp; &nbsp; 2976&nbsp; &nbsp; Yes正如@Cameron Riddell 所指出的。您还可以跳过布尔值反转并执行以下操作;df['Result']=np.where(df.ID.str.contains('(\D+)'),'No','Yes')

眼眸繁星

您可以使用.isnumeric()方法:df3["Result"] = df3["ID"].str.isnumeric().apply(lambda x: "No" if x == False else "Yes")
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python