比较numpy中的小数位,

4dbbbstv  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(84)

我有一个数据框,我需要在numpy.where中检查行的小数位数(使用其他条件),并为列分配一个值:(值为字符串格式)

现在,如果decimal的计数不是2,并且value不在-100到200之间,那么我必须在新列中添加一个值,表示“issues”,否则新列将为空。
我不想用apply,我想用numpy.where
输出:

cngwdvgl

cngwdvgl1#

具体的逻辑并不清楚,因为你的描述和例子并不完全匹配,但是对于一般的逻辑,假设你想标记以2位数结尾的值,或者不在-100-200之间,你可以使用pandas.to_numerid + between和一个带有str.extract + str.len的正则表达式:

import numpy as np

# is the numeric value between -100 and 200?
m1 = pd.to_numeric(df['name2'], errors='coerce').between(-100, 200)
# is the count of the decimal not 2?
m2 = df['name2'].str.extract(r'\.(\d*[1-9]+)', expand=False).str.len().ne(2)

df['Error'] = np.where(m1&m2, 'No Issue', 'Issue')

输出量:

Name      name2     Error
0    A      0.029  No Issue
1    B          0  No Issue
2    V          2  No Issue
3    D  -0.000029  No Issue
4    E      -0.11     Issue

可复制输入:

df = pd.DataFrame({'Name': list('ABVDE'),
                   'name2': ['0.029', '0', '2', '-0.000029', '-0.11']
                  })

中间体:

Name      name2    m1     m2  m1&m2     Error
0    A      0.029  True   True   True  No Issue
1    B          0  True   True   True  No Issue
2    V          2  True   True   True  No Issue
3    D  -0.000029  True   True   True  No Issue
4    E      -0.11  True  False  False     Issue
hpxqektj

hpxqektj2#

这是只使用np.where来得到你所问的答案。代码很容易阅读。

cond = (df['name2'].astype(str).str.split('.').str[1].str.len() == 2) | (~df['name2'].between(-100, 200))
df['flag'] = np.where(cond, "issue", "no issue")

name     name2      flag
0    A  0.029000  no issue
1    B  0.000000  no issue
2    C  2.000000  no issue
3    D -0.000029  no issue
4    E -0.110000     issue

相关问题