问题描述
>>> df
col_1 col_2 col_3
0 0.01 NaN 0.1
1 NaN 0.9 0.2
2 0.01 NaN 0.3
3 0.01 0.9 0.4
我可以按如下方式计算行均值,而 python 会正确跳过 NaN 值:
>>> df.mean(axis=1)
0 0.055000
1 0.550000
2 0.155000
3 0.436667
dtype: float64
>>> df.iloc[0,1]="str1"
>>> df
col_1 col_2 col_3
0 0.01 str1 0.1
1 NaN 0.9 0.2
2 0.01 NaN 0.3
3 0.01 0.9 0.4
>>> df.mean(axis=1)
0 0.055
1 0.200
2 0.155
3 0.205
dtype: float64
危险:输出看起来似是而非,但这是错误的,因为一旦我将位置 [0,1]
中的值更改为字符串,位置 [1,1]
和 {{ 1}} 从数字 [3,1]
变成字符串 0.9
,并且所有的字符串都从平均中省略(我猜每一列必须是相同的类型?这可能是有原因的,但是男孩,这是危险的微妙。)
我现在要做的是将数据框的所有条目强制恢复为数字类型。任何可以明智地强制转换为数字的东西都应该变成那个数字,而任何东西都应该变成 "0.9"
(不管它可能是什么字符串或类型)。
Pandas series 有一个函数 nan
,您可以在其中设置 pandas.to_numeric
,但不幸的是 df 的类似函数 (errors='coerce'
) 不允许此选项.
是否有一个函数可以“使 dataFrame 的每个元素看起来像一个数字,并将其他所有元素设为 DataFrame.astype()
”?
解决方法
我认为您可以在带有 to_numeric
的列子集上使用 apply
。 This answer 可能会有所帮助。
您可以apply
,默认情况下将在列上执行:
df.apply(pd.to_numeric,errors='coerce').mean(1)