10

我的桌子:

In [15]: csv=u"""a,a,,a
   ....: b,b,,b
   ....: c,c,,c
   ....: """

In [18]: df = pd.read_csv(io.StringIO(csv), header=None)

将空列填充为“未知”

In [19]: df
Out[19]: 
   0  1   2  3
0  a  a NaN  a
1  b  b NaN  b
2  c  c NaN  c

In [20]: df.fillna({2:'UNKNOWN'})

得到错误

ValueError: could not convert string to float: UNKNOWN
4

3 回答 3

10

您的2列可能有一个 float dtype:

>>> df
   0  1   2  3
0  a  a NaN  a
1  b  b NaN  b
2  c  c NaN  c
>>> df.dtypes
0     object
1     object
2    float64
3     object
dtype: object

因此问题。如果您不介意将整个帧转换为object,您可以:

>>> df.astype(object).fillna("UNKNOWN")
   0  1        2  3
0  a  a  UNKNOWN  a
1  b  b  UNKNOWN  b
2  c  c  UNKNOWN  c

根据是否存在非字符串数据,您可能希望在转换列 dtype 时更有选择性,和/或在读取时指定 dtypes,但无论如何,以上内容应该可以工作。


更新:如果您有要保留的 dtype 信息,而不是将其切换回来,我会采用另一种方式,只填写您想要的列,或者使用带有以下内容的循环fillna

>>> df
   0  1  2   3  4   5
0  0  a  a NaN  a NaN
1  1  b  b NaN  b NaN
2  2  c  c NaN  c NaN
>>> df.dtypes
0      int64
1     object
2     object
3    float64
4     object
5    float64
dtype: object
>>> for col in df.columns[pd.isnull(df).all()]:
...         df[col] = df[col].astype(object).fillna("UNKNOWN")
...     
>>> df
   0  1  2        3  4        5
0  0  a  a  UNKNOWN  a  UNKNOWN
1  1  b  b  UNKNOWN  b  UNKNOWN
2  2  c  c  UNKNOWN  c  UNKNOWN
>>> df.dtypes
0     int64
1    object
2    object
3    object
4    object
5    object
dtype: object

或者(如果你正在使用all),那么可能根本不使用fillna

>>> df
   0  1  2   3  4   5
0  0  a  a NaN  a NaN
1  1  b  b NaN  b NaN
2  2  c  c NaN  c NaN
>>> df.ix[:,pd.isnull(df).all()] = "UNKNOWN"
>>> df
   0  1  2        3  4        5
0  0  a  a  UNKNOWN  a  UNKNOWN
1  1  b  b  UNKNOWN  b  UNKNOWN
2  2  c  c  UNKNOWN  c  UNKNOWN
于 2013-04-17T18:25:17.630 回答
4

作为一种解决方法,只需直接设置列,fillna 上转换应该可以工作并且是一个错误

In [8]: df = pd.read_csv(io.StringIO(csv), header=None)

In [9]: df
Out[9]: 
   0  1   2  3
0  a  a NaN  a
1  b  b NaN  b
2  c  c NaN  c

In [10]: df.loc[:,2] = 'foo'

In [11]: df
Out[11]: 
   0  1    2  3
0  a  a  foo  a
1  b  b  foo  b
2  c  c  foo  c

In [12]: df.dtypes
Out[12]: 
0    object
1    object
2    object
3    object
dtype: object
于 2013-04-17T18:41:10.373 回答
0
df = pd.DataFrame({0:['a','b','c'], 1:['a','b','c'], 2:np.nan, 3:['a','b','c']})
df

    0   1   2   3
0   a   a   NaN a
1   b   b   NaN b
2   c   c   NaN c

您可以通过在方括号内指定列的名称并使用fillna

df[2].fillna('UNKNOWN', inplace=True)

如果你 print df,它会是这样的:

    0   1         2  3
0   a   a   UNKNOWN  a
1   b   b   UNKNOWN  b
2   c   c   UNKNOWN  c

您可以通过以下方式填充所有列中的所有空单元格:

df.fillna('UNKNOWN', inplace=True)
于 2021-07-11T08:53:10.143 回答