Pandas - 在分类数据中处理NaN

时间:2017-01-26 20:05:54

标签: python python-3.x pandas dataframe categorical-data

我在数据框中有一列有分类数据,但有些数据缺失,即NaN。我想对这些数据进行线性插值以填补缺失值,但我不确定如何去做。我不能删除NaN来将数据转换为分类类型,因为我需要填充它们。一个简单的例子来说明我想要做什么。

col1  col2
5     cloudy
3     windy
6     NaN
7     rainy
10    NaN

假设我想将col2转换为分类数据但保留NaN并使用线性插值填充它们如何进行处理。让我们说在将列转换为分类数据后,它看起来像这样

col2
1
2
NaN
3
NaN

然后我可以做线性插值并得到类似的东西

col2
1
2
3
3
2

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:5)

<强>更新

  

有没有办法在之后将数据转换回原始形式   插值,即代替1,2或3,你有阴天,刮风和下雨   再次?

解决方案:我故意在原始DF中添加了更多行:

In [129]: df
Out[129]:
   col1    col2
0     5  cloudy
1     3   windy
2     6     NaN
3     7   rainy
4    10     NaN
5     5  cloudy
6    10     NaN
7     7   rainy

In [130]: df.dtypes
Out[130]:
col1       int64
col2    category
dtype: object

In [131]: df.col2 = (df.col2.cat.codes.replace(-1, np.nan)
     ...:              .interpolate().astype(int).astype('category')
     ...:              .cat.rename_categories(df.col2.cat.categories))
     ...:

In [132]: df
Out[132]:
   col1    col2
0     5  cloudy
1     3   windy
2     6   rainy
3     7   rainy
4    10  cloudy
5     5  cloudy
6    10  cloudy
7     7   rainy

OLD&#34;数字&#34;回答:

IIUC你可以这样做:

In [66]: df
Out[66]:
   col1    col2
0     5  cloudy
1     3   windy
2     6     NaN
3     7   rainy
4    10     NaN

首先让我们分解col2

In [67]: df.col2 = pd.factorize(df.col2, na_sentinel=-2)[0] + 1

In [68]: df
Out[68]:
   col1  col2
0     5     1
1     3     2
2     6    -1
3     7     3
4    10    -1

现在我们可以对其进行插值(将-1替换为NaN&#39; s):

In [69]: df.col2.replace(-1, np.nan).interpolate().astype(int)
Out[69]:
0    1
1    2
2    2
3    3
4    3
Name: col2, dtype: int32

采用相同的方法,但将插值系列转换为category dtype:

In [70]: df.col2.replace(-1, np.nan).interpolate().astype(int).astype('category')
Out[70]:
0    1
1    2
2    2
3    3
4    3
Name: col2, dtype: category
Categories (3, int64): [1, 2, 3]

答案 1 :(得分:0)

我知道您要求线性插值,但这是您想更轻松地实现的另一种方法。由于建议将类别转换为数字并不是一个好主意。

您可以简单地在熊猫库中将插值方法与方法“ pad”一起使用:

df.interpolate(method='pad')

您还可以在here中查看其他方法和使用它们的示例。 (链接是插值的熊猫文档)