如何在 DataFrame 对象 dtype 中正确识别包含点的浮点值 [0, 1]?
How to correctly identify float values [0, 1] containing a dot, in DataFrame object dtype?
我有一个像这样的数据框,我的值是对象数据类型:
df = pd.DataFrame(data=['A', '290', '0.1744175757', '1', '1.0000000000'], columns=['Value'])
df
Out[65]:
Value
0 A
1 290
2 0.1744175757
3 1
4 1.0000000000
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 1 columns):
Value 5 non-null object
dtypes: object(1)
memory usage: 120.0+ bytes
我想要做的只是 select 百分比,在本例中为 0.1744175757 和 1.0000000000 的值,这恰好发生在我的数据中,它们都有一个 period/dot。这是一个关键点——我需要能够区分 1 整数值和 1.0000000000 百分比,以及 0 和 0.0000000000。
我试图寻找点字符的存在,但这不起作用,它 returns 对于每个值都是正确的,我不清楚为什么。
df[df['Value'].str.contains('.')]
Out[67]:
Value
0 A
1 290
2 0.1744175757
3 1
4 1.0000000000
我也试过 isdecimal(),但这不是我想要的:
df[df['Value'].str.isdecimal()]
Out[68]:
Value
1 290
3 1
我想出的最接近的函数:
def isPercent(x):
if pd.isnull(x):
return False
try:
x = float(x)
return x % 1 != 0
except:
return False
df[df['Value'].apply(isPercent)]
Out[74]:
Value
2 0.1744175757
但这无法正确识别 1.0000000000(和 0.0000000000)的场景。
我有两个问题:
- 为什么 str.contains('.') 在这种情况下不起作用?这似乎是最简单的方法,因为它会在 100% 的时间内为我提供我需要的数据,但它 returns 即使没有 '.' 也是如此。字符显然在值中。
- 我如何才能正确识别值中包含点字符的所有值 [0, 1]?
str.contains
默认执行基于正则表达式的搜索,并且“.”将匹配正则表达式引擎的任何字符。要禁用它,请使用 regex=False
:
df[df['Value'].str.contains('.', regex=False)]
Value
2 0.1744175757
4 1.0000000000
您也可以将其转义为字面意思:
df[df['Value'].str.contains(r'\.')]
Value
2 0.1744175757
4 1.0000000000
如果您真的只想获取浮点数,请尝试使用更健壮的正则表达式。
df[df['Value'].str.contains(r'\d+\.\d+')].astype(float)
Value
2 0.174418
4 1.000000
我有一个像这样的数据框,我的值是对象数据类型:
df = pd.DataFrame(data=['A', '290', '0.1744175757', '1', '1.0000000000'], columns=['Value'])
df
Out[65]:
Value
0 A
1 290
2 0.1744175757
3 1
4 1.0000000000
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 1 columns):
Value 5 non-null object
dtypes: object(1)
memory usage: 120.0+ bytes
我想要做的只是 select 百分比,在本例中为 0.1744175757 和 1.0000000000 的值,这恰好发生在我的数据中,它们都有一个 period/dot。这是一个关键点——我需要能够区分 1 整数值和 1.0000000000 百分比,以及 0 和 0.0000000000。
我试图寻找点字符的存在,但这不起作用,它 returns 对于每个值都是正确的,我不清楚为什么。
df[df['Value'].str.contains('.')]
Out[67]:
Value
0 A
1 290
2 0.1744175757
3 1
4 1.0000000000
我也试过 isdecimal(),但这不是我想要的:
df[df['Value'].str.isdecimal()]
Out[68]:
Value
1 290
3 1
我想出的最接近的函数:
def isPercent(x):
if pd.isnull(x):
return False
try:
x = float(x)
return x % 1 != 0
except:
return False
df[df['Value'].apply(isPercent)]
Out[74]:
Value
2 0.1744175757
但这无法正确识别 1.0000000000(和 0.0000000000)的场景。
我有两个问题:
- 为什么 str.contains('.') 在这种情况下不起作用?这似乎是最简单的方法,因为它会在 100% 的时间内为我提供我需要的数据,但它 returns 即使没有 '.' 也是如此。字符显然在值中。
- 我如何才能正确识别值中包含点字符的所有值 [0, 1]?
str.contains
默认执行基于正则表达式的搜索,并且“.”将匹配正则表达式引擎的任何字符。要禁用它,请使用 regex=False
:
df[df['Value'].str.contains('.', regex=False)]
Value
2 0.1744175757
4 1.0000000000
您也可以将其转义为字面意思:
df[df['Value'].str.contains(r'\.')]
Value
2 0.1744175757
4 1.0000000000
如果您真的只想获取浮点数,请尝试使用更健壮的正则表达式。
df[df['Value'].str.contains(r'\d+\.\d+')].astype(float)
Value
2 0.174418
4 1.000000