Python 如何找到哪些单元格不能';不能转换成浮动吗?

Python 如何找到哪些单元格不能';不能转换成浮动吗?,python,python-3.x,pandas,Python,Python 3.x,Pandas,pandas.DataFrame.astype(float)引发ValueError:无法将字符串转换为float错误 找到导致这种情况发生的单元格的最佳方法是什么?我认为您可以首先使用一些数字,例如1,使用参数errors='concurve'执行函数,如果值无法转换,则由NaN填充。然后你去查一下。最后一次用于查找包含NaN值的列和索引-这意味着显然存在string值或其他值,这些值无法转换为数字 import pandas as pd import numpy as np df = pd

pandas.DataFrame.astype(float)
引发
ValueError:无法将字符串转换为float
错误

找到导致这种情况发生的单元格的最佳方法是什么?

我认为您可以首先使用一些数字,例如
1
,使用参数
errors='concurve'
执行函数,如果值无法转换,则由
NaN
填充。然后你去查一下。最后一次用于查找包含
NaN
值的列和索引-这意味着显然存在
string
值或其他值,这些值无法转换为数字

import pandas as pd
import numpy as np

df = pd.DataFrame({'A':['a','b','',5],
                   'B':[4,5,6,5],
                   'C':[np.nan,8,9,7]})

print (df)
   A  B    C
0  a  4  NaN
1  b  5  8.0
2     6  9.0
3  5  5  7.0

您可以使用
dtype
属性来查找numpy对象的数据类型。 例如

这将生成一个布尔类型的输出,您可以从中轻松地进行比较

result
0     True
1     True
2    False
3    False
dtype: bool

上面的输出清楚地表明,索引2和3处的元素不是
浮点类型

,您可以简单地使用索引遍历单元格,并捕获如下错误:

for r in range(df_rows):
    for c in range(df_cols):
        try:
            float(df[r][c])
        except ValueError:
             print("Conversion error at coordinates", r, c)

我不会终止循环,因为您希望看到所有问题单元格,并且可能不止一个。

astype是否将尝试转换为
float
?比如如果它是一个字符串
'4.5'
,它会不会把它转换成
4.5
?你能验证不能转换的字符串是否是
NaN
??至于NaN值,您需要指定它们应该如何转换,但是您可以使用
.fillna
方法来进行转换。
aType(float)
如果原始
数据帧中存在
float('NaN')
,则不会引发
ValueError
。因此,通过这种方式,我可能会得到误报:这段代码将无法区分原始的
float('nan')
to\u numeric
创建的代码。顺便说一句,我注意到
astype(float)
to\u numeric
可以做什么有区别
astype(float)
将在空字符串上引发
ValueError
,而
pd.to\u numeric
将在默认情况下将其转换为
NaN
(即使没有
errors='concurve'
)。但这不会对代码造成任何问题。不过,这很奇怪,在某些情况下,这肯定会影响逻辑。事实上,在我的例子中,我有一堆
float('nan')
和一些空字符串:)如果我的答案或其他答案有用,请不要忘记。谢谢。
pd.to\u numeric
的另一个奇怪之处是,如果有一个不可解析的值,使用
errors='ignore'
可以保持整个列不变。我想它只会保持那些无法转换成数字的单元格不变。也许是虫子?如果不是这样的话,我们可以在应用'errors='ignore'后检查哪些单元格保留了它们原来的
str
类型。我希望避免for循环,因为
数据帧
很大。但这应该行得通。我认为你必须使用
.iloc
;否则,如果索引恰好有整数标签,那么迭代将是错误的。我不使用pandas,因此这是一个通用的建议——并且具有简单性的优点,或者至少我这么认为。请随意更正我的答案。
 df = pd.DataFrame([[1.9, 2.987, 'abcd',1]])
 result = df.dtypes == np.float64
result
0     True
1     True
2    False
3    False
dtype: bool
for r in range(df_rows):
    for c in range(df_cols):
        try:
            float(df[r][c])
        except ValueError:
             print("Conversion error at coordinates", r, c)