isdigit()独立工作,但不与np.wh公司

2024-04-24 14:36:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧如下

    Info
0   Tap
1   15k
2   rot
3   12psi

我正在运行下面的代码,以便只将数值放入一个新列中。如果字符串不包含数值,则新列中应包含“-”

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

我得到所有的'-`'s!!!你知道吗

但是,当运行any(char.isdigit() for char in <text to check>时,我正确地得到true或false。你知道吗

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

any(char.isdigit() for char in 'Tap')返回False。这些值与数据帧本身中的值相同!!你知道为什么它不能用吗哪里?你知道吗


Tags: 数据字符串代码ininfodffornp
2条回答

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

  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方法。你知道吗

问题是只要字符串完全由数字字符组成,isdigit就只能是True。下面是一个例子来说明这一点:

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

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

However, when the run any(char.isdigit() for char in i get true or false correctly

这是因为在本例中,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

相关问题 更多 >