47971


家の特徴を示す情報を持つ変数xより、シェアハウスと、バルコニーのある物件の場合に１とする  
次のような変数shareとbalconyを作成したいと考えています。

[code]

    index share balcony
    0       1       1
    1       0       1
    2       1       0
    3       1       0
    
[/code]

変数名を示すリスト var_nameと、キーワードを示すリスト var_tango  
より、目的の変数を作成したいと考えています。  
次のようなコードを作成しているのですが、  
nameという変数が作成されるのみで、  
ループに問題があるようです。

基本的なことが分かっていないのだと思いますが、  
解決する方法をご教示頂きたく、よろしくお願いします。

[code]

    df = pd.DataFrame(
        {'x': ['バルコニーのあるシェアハウス',
               '南にバルコニーあり',
               'シェアハウス',
               '角部屋、シェアハウス']})
    
    var_name = ['share','balcony']
    var_tango = ['シェア','バルコニー']
    
    for name in var_name:
        df["name"]=0  # dfにvar_nameの要素の変数名を作成する
        for tango in var_tango:
            if "tango" in str(df['ｘ'].iat[i]):　# x内にtangoの要素が入っていた場合に下記を実行
                df["name"].iat[i]= 1
    
[/code]


CC BY-SA 4.0
2018-08-31T07:20:58.320
47969
2018-08-31T12:41:32.497
20148
question
python pandas
文字列からのダミー変数作成


リストをまとめてループ処理できる`zip`と文字列を含むかどうかを判定する`str.contains`を使って次のようにかけます。

[code]

    import pandas as pd
    
    df = pd.DataFrame(
        {'x': ['バルコニーのあるシェアハウス',
               '南にバルコニーあり',
               'シェアハウス',
               '角部屋、シェアハウス']})
    
    var_name = ['share','balcony']
    var_tango = ['シェア','バルコニー']
    
    for (name, tango) in zip(var_name, var_tango):
        df[name] = df['x'].str.contains(tango).astype(int)
    
[/code]

`zip`を使わずに書けば以下のようになります。この問題では、`for`の二重ループにするのはよくないです。

[code]

    for i in range(len(var_name)):
        df[var_name[i]] = df['x'].str.contains(var_tango[i]).astype(int)
    
[/code]


CC BY-SA 4.0
2018-08-31T07:57:46.393
47971
2018-08-31T12:41:32.497
2018-08-31T12:41:32.497
15171
15171
47969
answer