6

次の質問があります: 欠損値が文字列 でマークされている pandas データフレームがありますna。その上で Imputer を実行して、欠損値を列の平均値に置き換えたいと考えています。sklearnのドキュメントによると、パラメーターmissing_valuesはこれに役立つはずです:

missing_values : 整数または「NaN」、オプション (デフォルト =「NaN」) 欠損値のプレースホルダー。missing_values のすべての出現が補完されます。np.nan としてエンコードされた欠損値には、文字列値「NaN」を使用します。

私の理解では、これは、私が書くと

df = pd.read_csv(filename)
imp = Imputer(missing_values='na')
imp.fit_transform(df)

これは、インピュターがデータフレーム内のすべてをna列の平均値に置き換えることを意味します。ただし、代わりにエラーが発生します。

ValueError: could not convert string to float: na

私は何を誤解していますか?これは、インピュターが機能する方法ではありませんか?naでは、文字列を平均に置き換えるにはどうすればよいでしょうか。ラムダを使用する必要がありますか?

ありがとうございました!

4

4 に答える 4

4

これらを列の平均値で置き換えたいと言っているので'na'、欠落していない値は確かに浮動小数点数であると推測しています。問題は、pandas が文字列を欠損値として認識しないため、一部のフレーバーではなく'na'dtype で列を読み取ることです。objectfloat

.csv適切な例として、次のファイルを検討してください。

 test.csv

 col1,col2
 1.0,1.0
 2.0,2.0
 3.0,3.0
 na,4.0
 5.0,5.0

単純な importを使用すると、それが dtypeでありdf = pd.read_csv('test.csv')、 dtype であることがわかります。しかし、一連のオブジェクトの平均をどのように取るのでしょうか?df.dtypescol1objectcol2float64

解決策は、文字列を欠損値としてpd.read_csv()解釈するように指示することです。'na'

df = pd.read_csv('test.csv', na_values='na')

結果のデータフレームには dtype の両方の列があり、インピューターfloat64を使用できるようになりました。

于 2016-07-01T17:58:25.917 に答える
0

ここで注意しなければならないことがいくつかあります。

タイプ「オブジェクト」またはカテゴリ変数に代入していないことを確認してください。次のようにデータを確認できます。

df = pd.read_csv(filename)

print(df.info(null_counts=True))

最後の列は型でなければなりません

例を見てみましょう:

df = pd.DataFrame({'A' : [1, 2, 2, 2, 'NaN', 3, 4, 5, 6], 'B' : [3, 3, 'NaN', 3, 3, 4, 3, 3, 3]})

出力:

df.head()


    A   B
---------
0   1   3
1   2   3
2   2   NaN
3   2   3
4   NaN 3

では、種類を見ていきましょう

df.info(null_counts=True)

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8
Data columns (total 2 columns):
0    9 non-null float64
1    9 non-null float64
dtypes: float64(2)
memory usage: 224.0 bytes

現在、次のように推測しています。

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)
df_imputed = pd.DataFrame(imputer.fit_transform(df))
df_imputed.head()


    0   1
-----------
0   1.0 3.0
1   2.0 3.0
2   2.0 3.0
3   2.0 3.0
4   2.0 3.0

これで問題ありませんが、カテゴリ (タイプ オブジェクト / 文字列) では実行できません。

これを処理する 1 つの方法は、次のようにカテゴリ機能を数値に変更することです。

df_with_cat = pd.DataFrame({'A': ['ios', 'android', 'web', 'NaN'], 'B' : [4, 4, 'NaN', 2]})
df_with_cat.head()


      A     B
-------------
0   ios     4
1   android 4
2   web     NaN
3   NaN     2

そして情報

df_with_cat.info(null_counts=True)

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
A    4 non-null object
B    4 non-null object
dtypes: object(2)
memory usage: 144.0+ bytes

B が数値であることは確かなので、次のようにします。

df_with_cat['B'] = df_with_cat['B'].astype(np.float)
df_with_cat.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
A    4 non-null object
B    3 non-null float64
dtypes: float64(1), object(1)
memory usage: 144.0+ bytes

上記とまったく同じインピュターを使用すると、エラーが発生します (試してみることができます)。

それでは、「A」カテゴリを数値に変換しましょう。

CATEGORICAL_FEATURES = [
    'A', 
]
data_dum = pd.get_dummies(df_with_cat, columns=['A'], drop_first=True)
data_dum.head()

    B   A_android   A_ios   A_web
---------------------------------
0   4       0         1       0
1   4       1         0       0
2   NaN     0         0       1
3   2       0         0       0

これで、データ フレーム上でまったく同じ Imputer を上から実行できます。

于 2019-02-05T16:32:00.483 に答える