52741


いつもお世話になっております。  
タイポからたまたま正解に辿り着けたのですが、ロジックがわからず、ご指導をお願いします。

■出力データ

[code]

    #       date       area    resident valueA   valueB  SD  KM
    48597  2019-01-26  tokyo   man      75000    6.96     1.1  1.1
    48598  2019-01-26  tokyo   woman    75000    6.96     1.1  1.1
    
[/code]

以下のコードの出力をすると、上記のような結果が得られます。この場合、goupbyで取得した値が、b.max()[0]は、dateを日付として取得することがわかるのですが、valueAを取得するための値が、b.mean()[1]ではなく、b.mean()[0]となります。この理由はなんでしょうか？

b.max()[0] ---> date  
b.mean()[1] ---> valueA 【不正解】  
b.mean()[0] ---> valueA 【正解】

■ソースコード

[code]

    df = pd.read_csv(f,header=None, usecols=[0,1, 2,10,11,13,14], names=['date','area','resident','valueA','valueB','SD','KM'], dtype={'date':'str','area':'str','resident':'str','valueA':'int','valueB':'float','SD':'float','KM':'float'})
    
    for a,b in df.groupby(['area', 'resident'], as_index=False):
    print(b.max()[0])  #date
    
    print(a[0])
    print(a[1])
    
    print(b.count()[1]) #count
    print(int(b.mean()[0])) #valueA
    print(round(b.mean()[1],2)) #valueB
    print(round(b.mean()[2],2)) #SD
    print(round(b.mean()[3],2)) #KM
    
[/code]

■参照csvデータ (以下のようなデータが大量に並ぶ)

[code]

    2019-01-26,tokyo,man,nameA,areaA,detailA,4,13,199000,15000,214000,16.77,A,1.0,1.0
    2019-01-26,tokyo,man,nameA,areaA,detailB,4,13,208000,15000,223000,16.87,B,1.0,1.0
    
[/code]


CC BY-SA 4.0
2019-02-12T21:58:51.230
52740
2019-02-13T00:17:57.257
2019-02-13T00:17:57.257
3060
31870
question
python pandas
pythonのgroupbyから取得できる値


とりあえず、下記を見てください  
それぞれ、 **dateteime型** , **object型** (str型), **int型** , **float型** のデータを持つ列
DataFrameを作成して、`dataframe.max(`) および `dataframe.mean()` を行った結果となります。

[code]

    import pandas as pd
    import numpy as np
    
    N=5
    df = pd.DataFrame(
        {'datetime型': pd.date_range('2019/1/1', periods=N, freq='1d'),
         'str型': list('ABCDE'),
         'int型': np.random.randint(0,10000,N),
         'float型': np.random.uniform(0.,10.,N)
        }
    )
    print(df)
    #   datetime型    float型  int型 str型
    #0 2019-01-01  5.746031  8496    A
    #1 2019-01-02  6.586894  8338    B
    #2 2019-01-03  0.605272  2340    C
    #3 2019-01-04  1.547762   193    D
    #4 2019-01-05  3.148205  3055    E
    
    
    ## 各列の型を確認
    print(df.dtypes)
    #datetime型    datetime64[ns]
    #float型              float64
    #int型                  int32
    #str型                 object
    #dtype: object
    
    ## 各列の最大を表示
    print(df.max())
    #datetime型    2019-01-05 00:00:00
    #float型                   6.58689
    #int型                        8496
    #str型                           E
    #dtype: object
    
    ## 列毎の平均を表示【 datetime型とstr型の列が無い！！！】
    print(df.mean())
    #float型       3.526833
    #int型      4484.400000
    #dtype: float64
    
[/code]

この結果からお解かりの通り **datetime型** や **object型** の列は、`dataframe.max()`
を使って最大値を得ることが出来るのですが、`dataframe.mean()`
による平均値の取得は得ることが出来ない（計算できないので省かれる）ということになります。

で、質問のコードの場合ですが、`b.mean()` を行った際に同じ理由により **'date'**
列の結果が得られないため、Index値がその分一つズレます。その結果 **valueA** の平均値は

[code]

    b.mean()[0]
    
[/code]

で得られるということになります。

個人的には、このような場合は **column index** を使用するのではなく **column name** を利用して

[code]

    b.mean()['valueA']
    
[/code]

とするほうが良いかと思います。


CC BY-SA 4.0
2019-02-12T23:58:24.137
52741
2019-02-12T23:58:24.137
24801
52740
answer