Pandas忽略非数值

2024-05-20 16:45:10 发布

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

我有这个测向仪:

     X
0   13500
1   13600
2   BBOX-001
3   Mobi-1
4   15003
5   15004

我正试图进入一个新的专栏。如果x>;15000,则值为A,否则为B。如果x为非数字(BBOX-001,Mobi-1),则应在x列中显示该值:

^{pr2}$

我在下面有这个,但是如何忽略X列中的非数值?在

df['Y'] = np.where(df['X'] > 15000, 'A', 'B')

Tags: gtdfmobinp数字where数值bbox
2条回答

您可以通过convert_objects实现您的目标:

import pandas as pd
import numpy as np

df = pd.DataFrame({'X': ['13500', '13600', 'BBOX-001', 'Mobi-1', '15003', '15004']})
# Convert only numeric value to put it in comparison
df['Y'] = np.where(df.X.convert_objects(convert_numeric=True) > 15000, 'A', 'B')

print (df)

输出:

^{pr2}$

df['X']包含数字和字符串的混合时,列的数据类型将是object,而不是数字数据类型。df['X']中的类似数字的项可能是int或float,甚至可能是字符串(从您的问题中看不清楚)。 在这种情况下,许多数值运算,如df['X'] > 15000可能会引起错误。在

要将类似数字的值视为数字,请使用pd.to_numeric将列转换为数字数据类型:

In [41]: numeric_X = pd.to_numeric(df['X'], errors='coerce')
In [43]: numeric_X
Out[43]: 
0    13500.0
1    13600.0
2        NaN
3        NaN
4    15003.0
5    15004.0
Name: X, dtype: float64

您还可以通过测试nan来识别类似字符串的值:

^{pr2}$
import numpy as np
import pandas as pd

df = pd.DataFrame({'X': ['13500', '13600', 'BBOX-001', 'Mobi-1', '15003', '15004']})

numeric_X = pd.to_numeric(df['X'], errors='coerce')
is_stringlike = np.isnan(numeric_X)
conditions = [numeric_X > 15000, is_stringlike]
choices = ['A', df['X']]
df['Y'] = (np.select(conditions, choices, default='B'))
print(df)

收益率

          X         Y
0     13500         B
1     13600         B
2  BBOX-001  BBOX-001
3    Mobi-1    Mobi-1
4     15003         A
5     15004         A

相关问题 更多 >