isdigit()独立工作,但不适用于np.where

时间:2019-09-19 12:59:01

标签: python pandas

我的数据框如下

    Info
0   Tap
1   15k
2   rot
3   12psi

我正在下面编写代码,以仅将数值添加到新列中。如果字符串不包含数值,则“-”应位于新列中

df['num']=np.where(any(char.isdigit() for char in df['Info']),df['Info'], '-')

我得到所有'-` !!!

但是,当运行any(char.isdigit() for char in <text to check>时,我正确地得出了对还是错。

例如 any(char.isdigit() for char in '15k')返回True

any(char.isdigit() for char in 'Tap')返回False。这些是数据框本身中的相同值!!知道为什么它不能与np.where一起使用吗?

2 个答案:

答案 0 :(得分:3)

问题在于,仅当字符串仅由数字字符组成时,isdigit才是True。这是一个说明这一点的示例:

l = ['123', 'ab12', 'shf']

list(map(str.isdigit, l))
# [True, False, False]

  

但是,当我在char中运行any(char.isdigit()正确或错误

这是因为在这种情况下,any的输入迭代器是一个字符串,因此在对字符串进行迭代时,它确实会找到数值:

any(char.isdigit() for char in '123aswd')
# True

但是,如初始示例所示,当输入迭代器为字符串列表时,除非它们仅由数字字符str.isdigit组成,否则将返回False


相反,您可以执行以下操作:

df['num'] = df.Info.str.extract(r'(\d+)').fillna('-')

print(df)

    Info num
0    Tap   -
1    15k  15
2    rot   -
3  12psi  12

答案 1 :(得分:1)

如上所述,有两个主要问题:

  1. 除非整个字符串都是数字,否则您的isdigit()将返回False
  2. np.where的结构应与您尝试传递回df的结构相同。在您的情况下,您只传递一个布尔值。

尝试一下:

df['num'] = np.where(df['Info'].str.contains('\d'), df['Info'], '-')

输出:

    Info    num
0    Tap      -
1    15k    15k
2    rot      -
3  12psi  12psi

这是假设您要复制整个元素。如果只希望数字本身,请在yatu的答案中使用str.extract方法。