我从cvs文件中读取。我的数据框包含真正浮动的字符串。还有NaN值。
基本上我想在平均值中转换NaN并在浮点数中转换字符串。
有些方法可以帮助像fillna
替换nan值,因为它不能得到平均值(原因值是字符串)。
还有一个float()
方法,但如果它应用于NaN,它将给出0,这对我不利。
是否有任何好的决定用均值替换NaN值并将字符串转换为浮点数?
数据帧示例:
1 9,5 50,6 45,75962845 2,6 6,5 11 8,9 NaN
2 10,5 59,9 74,44538987 0 4,5 8,9 NaN NaN
3 20,1 37,7 NaN 0,8 2,5 9,7 6,7 4,2
4 10,7 45,2 10,9710853 0,4 3,1 6,9 5,5 4,7
5 13,2 39,9 9,23393302 0 5,8 9,2 7,4 4,3
P.S As A. Leistra建议我使用
for col in df.columns:
df[col] = pd.to_numeric(df[col], errors='coerce')
df[col].fillna(df[col].mean())
带有to_numeric
的 errors='coerce'
会创建大量新的NaN。 errors='ignore'
参数似乎不错,但在TypeError: Can't convert 'int' object to str implicitly
df[col].fillna(df[col].mean())
P.S.2正如piRSquared建议我尝试在read_csv函数中添加decimal=','
。但它仍然给出了相同的错误TypeError: Can't convert 'int' object to str implicitly
答案 0 :(得分:3)
如果您使用decimal=','
,则应使用pd.read_csv
参数读取数据。否则,如果您坚持使用此数据框,则可以将其转储到csv并重试。
pd.read_csv(pd.io.common.StringIO(df.to_csv(index=False)), decimal=',')
0 1 2 3 4 5 6 7 8
0 1 9.5 50.6 45.759628 2.6 6.5 11.0 8.9 NaN
1 2 10.5 59.9 74.445390 0.0 4.5 8.9 NaN NaN
2 3 20.1 37.7 NaN 0.8 2.5 9.7 6.7 4.2
3 4 10.7 45.2 10.971085 0.4 3.1 6.9 5.5 4.7
4 5 13.2 39.9 9.233933 0.0 5.8 9.2 7.4 4.3
填写缺失数据变得容易。
d = pd.read_csv(pd.io.common.StringIO(df.to_csv(index=False)), decimal=',')
d.fillna(d.mean())
0 1 2 3 4 5 6 7 8
0 1 9.5 50.6 45.759628 2.6 6.5 11.0 8.900 4.4
1 2 10.5 59.9 74.445390 0.0 4.5 8.9 7.125 4.4
2 3 20.1 37.7 35.102509 0.8 2.5 9.7 6.700 4.2
3 4 10.7 45.2 10.971085 0.4 3.1 6.9 5.500 4.7
4 5 13.2 39.9 9.233933 0.0 5.8 9.2 7.400 4.3
答案 1 :(得分:1)
首先,您需要使用to_numeric
将字符串转换为浮点数:
for col in df.columns:
df[col] = pd.to_numeric(df[col], errors='coerce')
(使用'强制'用NaN替换不可转换的值,这就是你想要的)。然后,您就可以使用fillna
:
df.fillna(df.mean())