数据框= reviews
当我尝试将评分列转换为整数时出现以下错误
``无法将非有限值(NA或inf)转换为整数''
我该如何解决?
reviews.replace([np.inf, -np.inf], np.nan)
reviews.dropna()
reviews['Rating'].astype('int')
答案 0 :(得分:1)
最简单的方法是先将replace
infs转换为NaN,然后使用dropna
:
示例数据框:
>>> df = pd.DataFrame({'col1':[1, 2, 3, 4, 5, np.inf, -np.inf], 'col2':[6, 7, 8, 9, 10, np.inf, -np.inf]})
>>> df
col1 col2
0 1.000000 6.000000
1 2.000000 7.000000
2 3.000000 8.000000
3 4.000000 9.000000
4 5.000000 10.000000
5 inf inf
6 -inf -inf
解决方案1:
以这样一种方式创建df_new
,您就不会丢失真实的数据帧,而所需的dataFrame则不会分别df_new
。
>>> df_new = df.replace([np.inf, -np.inf], np.nan).dropna(subset=["col1", "col2"], how="all").astype(int)
>>> df_new
col1 col2
0 1 6
1 2 7
2 3 8
3 4 9
4 5 10
解决方案2:
使用isin
和~
:
>>> ff = df.isin([np.inf, -np.inf, np.nan]).all(axis='columns')
>>> df[~ff].astype(int)
col1 col2
0 1 6
1 2 7
2 3 8
3 4 9
4 5 10
或直接进入原始数据框,使用pd.DataFrame.isin
并检查带有pd.DataFrame.any
的行。最后,使用布尔数组对数据帧进行切片。
>>> df = df[~df.isin([np.nan, np.inf, -np.inf]).any(1)].astype(int)
>>> df
col1 col2
0 1 6
1 2 7
2 3 8
3 4 9
4 5 10
从here摘录自@piRSquared
解决方案3:
您可以自由使用dataFrame.mask
+ numpy.isinf
和dronna()
:
>>> df = df.mask(np.isinf(df)).dropna().astype(int)
>>> df
col1 col2
0 1 6
1 2 7
2 3 8
3 4 9
4 5 10
答案 1 :(得分:0)
.replace()
和.dropna()
均未执行其动作,例如修改现有数据框,除非您指定它们。但是,如果您确实指定执行它们,那么您的代码将起作用:
reviews.replace([np.inf, -np.inf], np.nan, inplace=True)
reviews.dropna(inplace=True)
reviews['Rating'].astype('int')
或者:
reviews = reviews.replace([np.inf, -np.inf], np.nan)
reviews = reviews.dropna()
reviews['Rating'].astype('int')