我的数据框如下
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一起使用吗?
答案 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)
如上所述,有两个主要问题:
isdigit()
将返回False
。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
方法。