2017-01-26 22 views
4

カテゴリデータを持つデータフレームの列がありますが、一部のデータが欠落しています。つまりNaNです。私は欠損値を埋めるためにこのデータの線形補間を実行したいが、それについてどうやって行くのか分からない。私はそれらを埋める必要があるので、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 

のようなものを得ることができますか?

答えて

5

UPDATE:

ではなく、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 "数値" の答え:

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 

今我々はそれを補間することができる(S 'のNaNとS' -1を置き換える):

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] 
+0

完璧に動作します。補間後にデータを元の形式に戻す方法はありますか?すなわち1,2または3の代わりに 'cloudy'、' windy'および 'rainy'をもう一度使用しますか? –

+1

@WasswaSamuel、私は自分の答えを更新しました - – MaxU

+1

をチェックしてください。今日は帰宅するfactorize()と補間():) – Vaishali

関連する問題