45113


python のデータフレームに、  
部屋の面積の入っている二つの変数xとyがあります。

xから、面積のデータを取り出し、  
yにも入っている面積のデータを、取り出して、  
面積のみを含む変数spaceを作りたいと考えています。

このことを意図してfor roop とif を用いて、  
spaceを作ろうとしていますが、エラーが生じて進みません。

エラーをなくす方法、あるいは別の方法がございましたら、ご教示頂けるとありがたいです。

[code]

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(
        {'x': ['15平米', '5分', '16平米'],
         'y':[np.nan, '16平米', np.nan]},
        index=[1,2,3])
    
    #単位を削除
    df["space"] = df.x.str.extract(r'(\d*)平米')
    df["y"] = df.y.str.extract(r'(\d*)平米')
    
    # 欠損値でないyをspaceに代入する。
    for i in range(len(df)):
        if df["y"][i]!=np.nan:
            df['space'][i] =df['y'][i]
    
[/code]


CC BY-SA 4.0
2018-06-28T01:57:38.993
45110
2018-06-28T13:31:16.973
20148
question
python pandas
欠損値を含む2変数の内容を1変数にまとめる方法


> エラーをなくす方法、あるいは別の方法がございましたら、ご教示頂けるとありがたいです。

以下を確認すると、行のラベルは1〜3が設定されています。

[code]

    print(df['y'])
    1    NaN
    2     16
    3    NaN
    Name: y, dtype: object
    
[/code]

そのため、行のラベルでアクセスしないと情報がとれないようです。

[code]

    print(df['y'][1], df['y'][2], df['y'][3])
    nan 16 nan
    
[/code]

以下ではエラーになります。

[code]

    print(df['y'][0])
    
[/code]

インデックスでアクセスする場合は、 dfのiatを使うようです。

[code]

    print(df['y'].iat[0], df['y'].iat[1], df['y'].iat[2])
    nan 16 nan
    
[/code]

また、NaNのチェックは pd.isnull を使うようです。

そのため、以下のようにすれば解決できそうです。

[code]

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(
        {'x': ['15平米', '5分', '16平米'],
         'y':[np.nan, '16平米', np.nan]},
        index=[1,2,3])
    
    #単位を削除
    df["space"] = df.x.str.extract(r'(\d*)平米')
    df["y"] = df.y.str.extract(r'(\d*)平米')
    
    # 欠損値でないyをspaceに代入する。
    for i in range(len(df)):
        if not pd.isnull(df["y"].iat[i]):
            df['space'].iat[i] =df['y'].iat[i]
    
[/code]

結果は、以下になります。

[code]

    print(df)
          x    y space
    1  15平米  NaN    15
    2    5分   16    16
    3  16平米  NaN    16
    
[/code]


CC BY-SA 4.0
2018-06-28T02:43:47.777
45113
2018-06-28T03:34:03.493
2018-06-28T03:34:03.493
45110
answer


pamdasらしく書くと、位置を指定する`loc`と欠損値でないことを評価する`notnull`を使うと次のようになります。

[code]

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(
        {'x': ['15平米', '5分', '16平米'],
         'y':[np.nan, '16平米', np.nan]},
        index=[1,2,3])
    
    #単位を削除
    df['space'] = df.x.str.extract(r'(\d*)平米')
    df['y'] = df.y.str.extract(r'(\d*)平米')
    
    df.loc[df["y"].notnull(),'space'] = df['y']
    
[/code]


CC BY-SA 4.0
2018-06-28T07:12:49.910
45119
2018-06-28T13:31:16.973
2018-06-28T13:31:16.973
15171
15171
45110
answer