38426


連続的な変数から、0－1のダミー変数を作成する場合を考えています。  
今、マンションの階数を示す変数がkaiに入っています。  
この変数から、１階の場合には、1、それ以外は0とするダミー変数 floor_1 を作成したい  
と考えています。

現在は、for文とif文の組合わせで作成しているのですが、  
うまくできたり、できなかったりします。

下記の場合ですと、エラーが出ています。  
よりスマートな方法があれば、ご教示頂けますとありがたいです。  
よろしくお願いします。

[code]

    import pandas as pd
    import numpy as np
    import re
    
    df = pd.DataFrame(
        {'kai': ['2', '-1', '1', '20']},
        index=[1, 2, 3,4])
    
    
    # 1階ダミー
    floor_1_ser = np.zeros((len(df),1))
    for i in range(len(df)):
        if df['kai'][i] == 1:
            floor_1_ser[i] = 1
    
    df["floor_1"] = floor_1_ser
    
    df['floor_1'].describe() 
    del(floor_1_ser)
    
[/code]


CC BY-SA 3.0
2017-10-04T07:04:14.060
38417
2017-10-04T09:55:02.527
2017-10-04T07:13:04.900
19110
20148
question
python pandas
連続変数からのダミー変数作成


まず

[code]

    df.kai == '1'
    
[/code]

の結果が

[code]

    1    False
    2    False
    3     True
    4    False
    Name: kai, dtype: bool
    
[/code]

になります。  
ここからnumpyのarrayを生成すると、

[code]

    np.array(df.kai == '1')
    # => array([False, False,  True, False], dtype=bool)
    
[/code]

ですね。

ところで、Pythonのbool型は実は[数値型](http://docs.python.jp/3.6/library/stdtypes.html#boolean-
values) (順序型)なので、intに変換するとFalseは0、Trueは1になります。

[code]

    int(True)
    # => 1
    int(False)
    # => 0
    
[/code]

したがって、型を数値型にすると、

[code]

    np.array(df.kai == '1', dtype=int)
    # => array([0, 0, 1, 0])
    
[/code]

が得られます。（必要なら浮動小数点にしてください）

あとは次元を操作して、

[code]

    np.array(df.kai == '1', dtype=int)[:, np.newaxis]
    array([[0],
           [0],
           [1],
           [0]])
    
[/code]

とすればよさそうです。


CC BY-SA 3.0
2017-10-04T09:55:02.527
38426
2017-10-04T09:55:02.527
12274
38417
answer