@MKsan (MK san)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Pythonにおいて、変数名に変数を入れて、新しいリストを作る方法

python初心者です。Polarsの勉強をしています。とある参考書に記載されたデータフレームの結合方法について、理解できなかった箇所があったため、解決したく質問させてください

やりたいこと

以下3つのデータフレームを使って、顧客単位で利用したホテル種別を集計したいと考えています

df_a(ホテルごとの予約情報)

┌────────────────┬─────────────┬──────────┐
│ reservation_id ┆ customer_id ┆ hotel_id │
│ ---            ┆ ---         ┆ ---      │
│ i64            ┆ i64         ┆ i64      │
╞════════════════╪═════════════╪══════════╡
│ 1              ┆ 53431       ┆ 2460     │
│ 2              ┆ 488390      ┆ 962      │
│ 3              ┆ 341335      ┆ 558      │
│ 4              ┆ 398981      ┆ 3666     │
│ 5              ┆ 220381      ┆ 2180     │
│ …              ┆ …           ┆ …        │
│ 1999996        ┆ 280303      ┆ 2357     │
│ 1999997        ┆ 499387      ┆ 319      │
│ 1999998        ┆ 461799      ┆ 2834     │
│ 1999999        ┆ 163568      ┆ 3643     │
│ 2000000        ┆ 449765      ┆ 820      │
└────────────────┴─────────────┴──────────┘

df_b(ホテル種別)

┌──────────┬────────────────┐
│ hotel_id ┆ hotel_type     │
│ ---      ┆ ---            │
│ i64      ┆ str            │
╞══════════╪════════════════╡
│ 1        ┆ ビジネスホテル   │
│ 2        ┆ リゾートホテル   │
│ 3        ┆ 民宿           │
│ 4        ┆ 民宿           │
│ 5        ┆ ビジネスホテル   │
│ …        ┆ …              │
│ 4996     ┆ 旅館           │
│ 4997     ┆ 旅館           │
│ 4998     ┆ 旅館           │
│ 4999     ┆ ビジネスホテル   │
│ 5000     ┆ 民宿           │
└──────────┴────────────────┘

df_c(宿泊者の情報)

┌─────────────┬─────────────┬─────┬──────┬────────────────────┬──────────────┬────────────────┬─────────────────┐
│ customer_id ┆ name        ┆ age ┆ sex  ┆ address_prefecture ┆ address_city ┆ address_town   ┆ address_zipcode │
│ ---         ┆ ---         ┆ --- ┆ ---  ┆ ---                ┆ ---          ┆ ---            ┆ ---             │
│ i64         ┆ str         ┆ i64 ┆ str  ┆ str                ┆ str          ┆ str            ┆ str             │
╞═════════════╪═════════════╪═════╪══════╪════════════════════╪══════════════╪════════════════╪═════════════════╡
│ 1           ┆ 山田 裕太   ┆ 75  ┆ null ┆ 岐阜県             ┆ 岐阜市       ┆ 鷺山清洲町     ┆ 502-0853        │
│ 2           ┆ 藤井 稔     ┆ 83  ┆ M    ┆ 大阪府             ┆ 豊能郡能勢町 ┆ 地黄           ┆ 563-0121        │
│ 3           ┆ 青木 太一   ┆ 62  ┆ M    ┆ 佐賀県             ┆ 佐賀市       ┆ 本庄町袋       ┆ 840-0023        │
│ 4           ┆ 渡辺 裕太   ┆ 28  ┆ M    ┆ 福島県             ┆ 喜多方市     ┆ 豊川町高堂太   ┆ 966-0911        │
│ 5           ┆ 渡辺 明美   ┆ 62  ┆ F    ┆ 兵庫県             ┆ 西宮市       ┆ 津門西口町     ┆ 663-8231        │
│ …           ┆ …           ┆ …   ┆ …    ┆ …                  ┆ …            ┆ …              ┆ …               │
│ 499996      ┆ 高橋 洋介   ┆ 26  ┆ M    ┆ 山形県             ┆ 山形市       ┆ 下東山         ┆ 990-2232        │
│ 499997      ┆ 山口 治     ┆ 42  ┆ M    ┆ 岩手県             ┆ 一関市       ┆ 室根町津谷川   ┆ 029-1211        │
│ 499998      ┆ 石井 拓真   ┆ 39  ┆ M    ┆ 山形県             ┆ 山形市       ┆ 桜ケ丘         ┆ 990-2376        │
│ 499999      ┆ 坂本 くみ子 ┆ 66  ┆ F    ┆ 群馬県             ┆ 富岡市       ┆ 曽木           ┆ 370-2315        │
│ 500000      ┆ 前田 聡太郎 ┆ 49  ┆ null ┆ 兵庫県             ┆ 姫路市       ┆ 広畑区西夢前台 ┆ 671-1103        │
└─────────────┴─────────────┴─────┴──────┴────────────────────┴──────────────┴────────────────┴─────────────────┘

実行手順

第1ステップとしてdf_aとdf_bそれぞれのhotel_idをキーとして、left joinします。(これの結果をdf_dとします)

df_d = df_a.join(df_b,on = 'hotel_id', how = 'left')
print(f.collect().sort('customer_id'))

df_dの実行結果

┌────────────────┬─────────────┬──────────┬────────────────┐
│ reservation_id ┆ customer_id ┆ hotel_id ┆ hotel_type     │
│ ---            ┆ ---         ┆ ---      ┆ ---            │
│ i64            ┆ i64         ┆ i64      ┆ str            │
╞════════════════╪═════════════╪══════════╪════════════════╡
│ 12086          ┆ 1           ┆ 1282     ┆ 民宿           │
│ 490012         ┆ 1           ┆ 563      ┆ 民宿           │
│ 1009449        ┆ 1           ┆ 188      ┆ 旅館           │
│ 1307084        ┆ 1           ┆ 3688     ┆ 民宿           │
│ 1312786        ┆ 1           ┆ 4284     ┆ ビジネスホテル  │
│ …              ┆ …           ┆ …        ┆ …              │
│ 255571         ┆ 500000      ┆ 63       ┆ リゾートホテル  │
│ 590942         ┆ 500000      ┆ 1815     ┆ リゾートホテル  │
│ 1404470        ┆ 500000      ┆ 3002     ┆ ビジネスホテル  │
│ 1432744        ┆ 500000      ┆ 1769     ┆ 旅館           │
│ 1575573        ┆ 500000      ┆ 2339     ┆ ビジネスホテル  │
└────────────────┴─────────────┴──────────┴────────────────┘

第2ステップとして、df_dのcustomer_idを集約して、reservation_idごとにhotel_typeを集計します(これの結果をdf_eとします)これのコードに不明点がございます。

df_e = df_d.group_by('customer_id').agg([
    pl.col('reservation_id').filter(pl.col('hotel_type') == 'ビジネスホテル').len().alias('business_hotel_count'),
    pl.col('reservation_id').filter(pl.col('hotel_type') == 'リゾートホテル').len().alias('resort_hotel_count'),
    pl.col('reservation_id').filter(pl.col('hotel_type') == '民宿').len().alias('minsyuku_count'),
    pl.col('reservation_id').filter(pl.col('hotel_type') == '旅館').len().alias('ryokan_count')
])

df_eの実行結果

┌────────────────┬─────────────┬──────────┬────────────────┐
│ reservation_id ┆ customer_id ┆ hotel_id ┆ hotel_type     │
│ ---            ┆ ---         ┆ ---      ┆ ---            │
│ i64            ┆ i64         ┆ i64      ┆ str            │
╞════════════════╪═════════════╪══════════╪════════════════╡
│ 12086          ┆ 1           ┆ 1282     ┆ 民宿           │
│ 490012         ┆ 1           ┆ 563      ┆ 民宿           │
│ 1009449        ┆ 1           ┆ 188      ┆ 旅館           │
│ 1307084        ┆ 1           ┆ 3688     ┆ 民宿           │
│ 1312786        ┆ 1           ┆ 4284     ┆ ビジネスホテル   │
│ …              ┆ …           ┆ …        ┆ …              │
│ 255571         ┆ 500000      ┆ 63       ┆ リゾートホテル   │
│ 590942         ┆ 500000      ┆ 1815     ┆ リゾートホテル   │
│ 1404470        ┆ 500000      ┆ 3002     ┆ ビジネスホテル   │
│ 1432744        ┆ 500000      ┆ 1769     ┆ 旅館           │
│ 1575573        ┆ 500000      ┆ 2339     ┆ ビジネスホテル   │
└────────────────┴─────────────┴──────────┴────────────────┘

第3ステップとして、df_cとdf_eそれぞれのcustomer_idをキーとして、left joinします。※質問に触れる箇所ではないため、コードと出力結果は省略します

解決したいこと

第2ステップのソースコードで、reservation_idが出現していますが、これは何の目的で使用しているのでしょうか。唐突に出てきたため、理解できずにいます

0 likes

1Answer

データベースでいう中間テーブルという奴です
全ての予約に固有の番号を振っていると考えてください
そこからgroupbyで宿泊者毎、filter().len()でさらに特定のホテル種別毎の長さ=予約件数を取ってます

1Like

Your answer might help someone💌