93035


#### 実行環境

Windows 10  
Python 3.X  
pandas

### データの説明

次のようなdfを使用してデータ加工を行いたいと考えています。  
こちらはid,数値,分類というカラムで構成されています。  
複数のidが重複しており、三つの分類これらのidは必ず三つの分類(type1,type2,type3)に分かれています。  
columnの分類に書かれているのですが、そのデータは重複したデータのいずれかの行に書かれています。(どこに書かれているかはそれぞれ）  
カラムの数値には、重複したidの最後の行に整数で数値が書かれています。

### やりたいこと

分類ごとに数値を取得し、最終的には三つの分類のそれぞれで数値の平均、最大値、最小値を求めたいと考えております。そのため、aaaの時の分類が何であるか、bbbの時の分類は何であるかを取得し、それらの数値をtype1,type2,type3のリストに入れていきたいと考えているのですが、pandasに使い慣れていないため、どのよう具体的にどのような流れでコードを書けばよいかがわかりません。pandasのどの機能を使えばうまく数値取得まで行けるでしょうか？

id | 数値 | 分類  
---|---|---  
aaa |  |  
aaa |  |  
aaa | 111 | type2  
bbb |  |  
bbb |  | type1  
bbb | 222 |  
ccc |  | type3  
ccc |  |  
ccc | 333 |


CC BY-SA 4.0
2022-12-27T03:04:03.883
93032
2022-12-27T08:56:17.977
2022-12-27T04:46:26.297
3060
47546
question
python pandas
pandasでの特定の条件下でのデータ取得ができない。


※ テスト用に行を追加しています。

[code]

    import pandas as pd
    import io
    
    csv_data = '''
    id,数値,分類
    aaa,,
    aaa,,
    aaa,111,type2
    bbb,,
    bbb,,type1
    bbb,222,
    ccc,,type3
    ccc,,
    ccc,333
    ddd,,
    ddd,,
    ddd,1234,type2
    '''
    df = pd.read_csv(io.StringIO(csv_data))
    
    #
    dic = df.groupby('id').agg({'数値': 'last', '分類': 'first'})\
            .groupby('分類')['数値'].agg(list).to_dict()
    
    print(dic)
    
    # {'type1': [222.0], 'type2': [111.0, 1234.0], 'type3': [333.0]}
    
[/code]

[pandas.core.groupby.GroupBy.first — pandas 1.5.2
documentation](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.core.groupby.GroupBy.first.html)

> `final GroupBy.first(numeric_only=False, min_count=- 1)`
>
> Compute the **first non-null entry** of each column.


CC BY-SA 4.0
2022-12-27T04:38:55.837
93034
2022-12-27T08:04:41.763
2022-12-27T08:04:41.763
47127
47127
93032
answer


> pandasに使い慣れていないため、どのよう具体的にどのような流れでコードを書けばよいかがわかりません。

分かりやすいかどうかわからないけど, ステップごと  
ひとつずつ別の DataFrameにしてます

結果としてリストが必要ということなので, 辞書でリスト

**update:** agg指定を変更 lastや firstへ

[code]

    df = pd.read_csv(tsvf)  #, keep_default_na=False)
    # idでグループ
    df2 = df.groupby('id', as_index=False).agg({'id': 'first', '数値': 'last', '分類': 'first'})
    # 横並べ or 縦並べ
    df3 = df2.pivot(index='分類', columns='id', values='数値').T
    
    # idごとのリスト (辞書)
    dct = {t: [int(n) for n in df3[t].to_list() if not pd.isnull(n)]
            for t in ('type1', 'type2', 'type3')}
    dct
    # {'type1': [222], 'type2': [111], 'type3': [333]}
    
[/code]

※  
`['ddd', 444, 'type3']` の項目があったとするなら  
'type3' のリストに追加した結果になるはず


CC BY-SA 4.0
2022-12-27T04:51:41.173
93035
2022-12-27T08:56:17.977
2022-12-27T08:56:17.977
43025
43025
93032
answer