Skip to content

็ช—ๅฃๅ‡ฝๆ•ฐ ๐Ÿš€๐Ÿš€ โ€‹

็ช—ๅฃๅ‡ฝๆ•ฐๆ˜ฏไธ€็งๅผบๅคง็š„่กจ่พพๅผใ€‚ๅฎƒๅฏไปฅ่ฎฉ็”จๆˆทๅœจ select ไธŠไธ‹ๆ–‡ไธญๅˆ†็ป„่ฟ›่กŒ็ฑป่šใ€‚ ่ฎฉๆˆ‘ไปฌ้€š่ฟ‡ไพ‹ๅญ็œ‹็œ‹่ฟ™ๆ˜ฏไป€ไนˆๆ„ๆ€ใ€‚้ฆ–ๅ…ˆ๏ผŒๆˆ‘ไปฌๅˆ›ๅปบไธ€ไธชๆ•ฐๆฎ็ป“ๆž„๏ผŒ่ฟ™ไธชๆ•ฐๆฎๅŒ…ๅซๅฆ‚ไธ‹ๅˆ—๏ผŒๅˆ†ๅˆซไปฃ่กจๅฃ่ข‹ๅฆ–ๆ€ช็š„ไธ€ไบ›ไฟกๆฏ๏ผš

['#', 'Name', 'Type 1', 'Type 2', 'Total', 'HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed', 'Generation', 'Legendary']

py
import polars as pl

# ็„ถๅŽ๏ผŒ่ฎฉๆˆ‘ไปฌๅŠ ่ฝฝไธ€ไบ›ๅŒ…pokemonไฟกๆฏ็š„csvๆ•ฐๆฎ
df = pl.read_csv(
    "https://gist.githubusercontent.com/ritchie46/cac6b337ea52281aa23c049250a4ff03/raw/89a957ff3919d90e6ef2d34235e6bf22304f3366/pokemon.csv"
)
print(df)
txt
shape: (163, 13)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ #   โ”† Name                  โ”† Type 1  โ”† Type 2 โ”† โ€ฆ โ”† Sp. Def โ”† Speed โ”† Generation โ”† Legendary โ”‚
โ”‚ --- โ”† ---                   โ”† ---     โ”† ---    โ”†   โ”† ---     โ”† ---   โ”† ---        โ”† ---       โ”‚
โ”‚ i64 โ”† str                   โ”† str     โ”† str    โ”†   โ”† i64     โ”† i64   โ”† i64        โ”† bool      โ”‚
โ•žโ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ 1   โ”† Bulbasaur             โ”† Grass   โ”† Poison โ”† โ€ฆ โ”† 65      โ”† 45    โ”† 1          โ”† false     โ”‚
โ”‚ 2   โ”† Ivysaur               โ”† Grass   โ”† Poison โ”† โ€ฆ โ”† 80      โ”† 60    โ”† 1          โ”† false     โ”‚
โ”‚ 3   โ”† Venusaur              โ”† Grass   โ”† Poison โ”† โ€ฆ โ”† 100     โ”† 80    โ”† 1          โ”† false     โ”‚
โ”‚ 3   โ”† VenusaurMega Venusaur โ”† Grass   โ”† Poison โ”† โ€ฆ โ”† 120     โ”† 80    โ”† 1          โ”† false     โ”‚
โ”‚ โ€ฆ   โ”† โ€ฆ                     โ”† โ€ฆ       โ”† โ€ฆ      โ”† โ€ฆ โ”† โ€ฆ       โ”† โ€ฆ     โ”† โ€ฆ          โ”† โ€ฆ         โ”‚
โ”‚ 147 โ”† Dratini               โ”† Dragon  โ”† null   โ”† โ€ฆ โ”† 50      โ”† 50    โ”† 1          โ”† false     โ”‚
โ”‚ 148 โ”† Dragonair             โ”† Dragon  โ”† null   โ”† โ€ฆ โ”† 70      โ”† 70    โ”† 1          โ”† false     โ”‚
โ”‚ 149 โ”† Dragonite             โ”† Dragon  โ”† Flying โ”† โ€ฆ โ”† 100     โ”† 80    โ”† 1          โ”† false     โ”‚
โ”‚ 150 โ”† Mewtwo                โ”† Psychic โ”† null   โ”† โ€ฆ โ”† 90      โ”† 130   โ”† 1          โ”† true      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Groupby ็ฑป่š โ€‹

ไธ‹้ขๆˆ‘ไปฌ็œ‹็œ‹ๅฆ‚ไฝ•็”จ็ช—ๅฃๅ‡ฝๆ•ฐๅฏนไธๅŒ็š„ๅˆ—ๅˆ†็ป„ๅนถไธ”็ฑป่šใ€‚่ฟ™ๆ ทๆˆ‘ไปฌๅฏไปฅๅœจไธ€ๆฌกๆŸฅ่ฏขไธญๅนถ่กŒ็š„่ฟ่กŒๅคšไธชๅˆ†็ป„ๆ“ไฝœใ€‚ ็ฑป่š็š„็ป“ๆžœไผšๆŠ•ๅฐ„ไผšๅŽŸๆœ‰็š„่กŒใ€‚ๅ› ๆญค๏ผŒ็ช—ๅฃๅ‡ฝๆ•ฐๆฐธ่ฟœ่ฟ”ๅ›žไธ€ไธช่ทŸๅŽŸๆœ‰ DataFrame ไธ€ๆ ท่ง„ๆ ผ็š„ DataFrameใ€‚

ๆณจๆ„๏ผŒๆˆ‘ไปฌไฝฟ็”จไบ† .over("Type 1") ๅ’Œ .over(["Type 1", "Type 2"])๏ผŒๅˆฉ็”จ็ช—ๅฃๅ‡ฝๆ•ฐๆˆ‘ไปฌๅฏไปฅไธ€ไธช select ่ฏญๅขƒไธญๅฎž็Žฐๅคšไธชๅˆ†็ป„็ฑป่šใ€‚

ๆ›ดๅฅฝ็š„ๆ˜ฏ๏ผŒ่ฎก็ฎ—่ฟ‡็š„ๅˆ†็ป„ไผš่ขซ็ผ“ๅญ˜ๅนถไธ”ๅœจไธๅŒ็š„็ช—ๅฃๅ‡ฝๆ•ฐไธญๅ…ฑไบซใ€‚

py
import polars as pl
from .window_1 import df

out = df.select(
    [
        "Type 1",
        "Type 2",
        pl.col("Attack").mean().over("Type 1").alias("avg_attack_by_type"),
        pl.col("Defense").mean().over(["Type 1", "Type 2"]).alias("avg_defense_by_type_combination"),
        pl.col("Attack").mean().alias("avg_attack"),
    ]
)
print(out)
txt
shape: (163, 5)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Type 1  โ”† Type 2 โ”† avg_attack_by_type โ”† avg_defense_by_type_combination โ”† avg_attack โ”‚
โ”‚ ---     โ”† ---    โ”† ---                โ”† ---                             โ”† ---        โ”‚
โ”‚ str     โ”† str    โ”† f64                โ”† f64                             โ”† f64        โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ Grass   โ”† Poison โ”† 72.923077          โ”† 67.8                            โ”† 75.349693  โ”‚
โ”‚ Grass   โ”† Poison โ”† 72.923077          โ”† 67.8                            โ”† 75.349693  โ”‚
โ”‚ Grass   โ”† Poison โ”† 72.923077          โ”† 67.8                            โ”† 75.349693  โ”‚
โ”‚ Grass   โ”† Poison โ”† 72.923077          โ”† 67.8                            โ”† 75.349693  โ”‚
โ”‚ โ€ฆ       โ”† โ€ฆ      โ”† โ€ฆ                  โ”† โ€ฆ                               โ”† โ€ฆ          โ”‚
โ”‚ Dragon  โ”† null   โ”† 94.0               โ”† 55.0                            โ”† 75.349693  โ”‚
โ”‚ Dragon  โ”† null   โ”† 94.0               โ”† 55.0                            โ”† 75.349693  โ”‚
โ”‚ Dragon  โ”† Flying โ”† 94.0               โ”† 95.0                            โ”† 75.349693  โ”‚
โ”‚ Psychic โ”† null   โ”† 53.875             โ”† 51.428571                       โ”† 75.349693  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅˆ†็ป„ๆ“ไฝœ โ€‹

็ช—ๅฃๅ‡ฝๆ•ฐไธไป…ไป…ๅฏไปฅ็ฑป่š๏ผŒ่ฟ˜ๅฏไปฅ็”จๆฅๆŒ‰็…ง็ป„ๆ–ฝๅŠ ่‡ชๅฎšไน‰ๅ‡ฝๆ•ฐใ€‚ไพ‹ๅฆ‚๏ผŒๅฆ‚ๆžœไฝ ๆƒณ่ฆๅœจๆŸไธ€็ป„ไธญๆŽ’ๅบ๏ผŒไฝ ๅฏไปฅ๏ผš .col("value").sort().over("group")ใ€‚

่ฎฉๆˆ‘ไปฌ่ฏ•็€่ฟ‡ๆปคไธ€ไบ›่กŒ๏ผš

py
import polars as pl
from .window_1 import df

filtered = df.filter(pl.col("Type 2") == "Psychic").select(
    [
        "Name",
        "Type 1",
        "Speed",
    ]
)
print(filtered)
txt
shape: (7, 3)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Name                โ”† Type 1 โ”† Speed โ”‚
โ”‚ ---                 โ”† ---    โ”† ---   โ”‚
โ”‚ str                 โ”† str    โ”† i64   โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ Slowpoke            โ”† Water  โ”† 15    โ”‚
โ”‚ Slowbro             โ”† Water  โ”† 30    โ”‚
โ”‚ SlowbroMega Slowbro โ”† Water  โ”† 30    โ”‚
โ”‚ Exeggcute           โ”† Grass  โ”† 40    โ”‚
โ”‚ Exeggutor           โ”† Grass  โ”† 55    โ”‚
โ”‚ Starmie             โ”† Water  โ”† 115   โ”‚
โ”‚ Jynx                โ”† Ice    โ”† 95    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆณจๆ„ๅˆฐ๏ผŒๅˆ†็ป„ Water ็š„ๅˆ— Type 1 ๅนถไธ่ฟž็ปญ๏ผŒไธญ้—ดๆœ‰ไธค่กŒ Grassใ€‚่€Œไธ”๏ผŒๅŒ็ป„ไธญ็š„ๆฏไธ€ไธชๅฃ่ข‹ๅฆ–่‚ก ่ขซๆŒ‰็…ง Speed ๅ‡ๅบๆŽ’ๅˆ—ใ€‚ไธๅนธ็š„ๆ˜ฏ๏ผŒ่ฟ™ไธชไพ‹ๅญๆˆ‘ไปฌๅธŒๆœ›้™ๅบๆŽ’ๅˆ—๏ผŒๅนธ่ฟ็š„ๆ˜ฏ๏ผŒ่ฟ™ๅพˆ็ฎ€ๅ•๏ผš

py
import polars as pl
from .window_group_1 import filtered

out = filtered.with_columns(
    [
        pl.col(["Name", "Speed"]).sort(descending=True).over("Type 1"),
    ]
)
print(out)
txt
shape: (7, 3)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Name                โ”† Type 1 โ”† Speed โ”‚
โ”‚ ---                 โ”† ---    โ”† ---   โ”‚
โ”‚ str                 โ”† str    โ”† i64   โ”‚
โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•โ•ชโ•โ•โ•โ•โ•โ•โ•โ•ก
โ”‚ Starmie             โ”† Water  โ”† 115   โ”‚
โ”‚ Slowpoke            โ”† Water  โ”† 30    โ”‚
โ”‚ SlowbroMega Slowbro โ”† Water  โ”† 30    โ”‚
โ”‚ Exeggutor           โ”† Grass  โ”† 55    โ”‚
โ”‚ Exeggcute           โ”† Grass  โ”† 40    โ”‚
โ”‚ Slowbro             โ”† Water  โ”† 15    โ”‚
โ”‚ Jynx                โ”† Ice    โ”† 95    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Polars ไผš่ฟฝ่ธชๆฏไธช็ป„็š„ไฝ็ฝฎ๏ผŒๅนถๆŠŠ็›ธๅบ”็š„่กจ่พพๅผๆ˜ ๅฐ„ๅˆฐ้€‚ๅฝ“็š„่กŒใ€‚่ฟ™ไธชๆ“ไฝœๅฏไปฅๅœจไธ€ไธช select ็ŽฏๅขƒไธญๅฎŒๆˆใ€‚

็ช—ๅฃๅ‡ฝๆ•ฐ็š„ๅผบๅคงไน‹ๅค„ๅœจไบŽ๏ผšไฝ ้€šๅธธไธ้œ€่ฆ groupby -> explode ็ป„ๅˆ๏ผŒ่€Œๆ˜ฏๆŠŠ้€ป่พ‘ๆ”พๅ…ฅไธ€ไธช่กจ่พพๅผไธญใ€‚ ่ฟ™ไนŸไฝฟๅพ— API ๆ›ดๅŠ ็ฎ€ๆด๏ผš

  • groupby -> ๆ ‡่ฎฐ็ฑป่š็š„ๅˆ†็ป„๏ผŒ่ฟ”ๅ›žไธ€ไธช่ทŸ็ป„็š„ไธชๆ•ฐไธ€่‡ด็š„ DataFrame
  • over -> ๆ ‡่ฎฐๆˆ‘ไปฌๅธŒๆœ›ๅฏน่ฟ™ไธชๅˆ†็ป„่ฟ›่กŒ่ฎก็ฎ—๏ผŒไฝ†ๆ˜ฏไธไผšๆ›ดๆ”นๅŽŸๆœ‰ DataFrame ็š„ๅฝข็Šถ

็ช—ๅฃ่กจ่พพๅผ็š„่ง„ๅˆ™ โ€‹

็ช—ๅฃ่กจ่พพๅผ็š„่ฎก็ฎ—่ง„ๅˆ™ๅฆ‚ไธ‹๏ผˆๅ‡่ฎพๆˆ‘ไปฌๆœ‰ไธ€ไธช pl.Int32 ๅˆ—๏ผ‰๏ผš

python
# ๅˆ†็ป„ๅ†…็ฑป่šไธ”ๅนฟๆ’ญ
# ่พ“ๅ‡บ็ฑปๅž‹: -> Int32
pl.sum("foo").over("groups")

# ็ป„ๅ†…ๅŠ ๅ’Œ๏ผŒ็„ถๅŽไน˜ไปฅ็ป„ๅ†…็š„ๅ…ƒ็ด 
# ่พ“ๅ‡บ็ฑปๅž‹: -> Int32
(pl.col("x").sum() * pl.col("y")).over("groups")

# ็ป„ๅ†…ๅŠ ๅ’Œ๏ผŒ็„ถๅŽไน˜ไปฅ็ป„ๅ†…็š„ๅ…ƒ็ด 
# ๅนถไธ”็ป„ๅ†…็ฑป่šๆˆไธ€ไธชๅˆ—่กจ
# ่พ“ๅ‡บ็ฑปๅž‹: -> List(Int32)
(pl.col("x").sum() * pl.col("y")).list().over("groups")

# ๆณจๆ„่ฟ™้‡Œ้œ€่ฆไธ€ไธชๆ˜พๅผ็š„ `list` ่ฐƒ็”จ
# ็ป„ๅ†…ๅŠ ๅ’Œ๏ผŒ็„ถๅŽไน˜ไปฅ็ป„ๅ†…็š„ๅ…ƒ็ด 
# ๅนถไธ”็ป„ๅ†…็ฑป่šๆˆไธ€ไธชๅˆ—่กจ
# list() ไผšๅฑ•ๅผ€

# ๅฆ‚ๆžœ็ป„ๅ†…ๆ˜ฏๆœ‰ๅบ็š„๏ผŒ่ฟ™ๆ˜ฏๆœ€ๅฟซ็š„ๆ“ไฝœๆ–นๆณ•๏ผš
(pl.col("x").sum() * pl.col("y")).list().over("groups").flatten()

ๅฑ•ๅผ€็ช—ๅฃๅ‡ฝๆ•ฐ โ€‹

ๅฐฑๅƒๅˆšๅˆš็š„ไพ‹ๅญ๏ผŒๅฆ‚ๆžœไฝ ็š„็ช—ๅฃๅ‡ฝๆ•ฐ่ฟ”ๅ›žไธ€ไธช list๏ผš

pl.col("Name").sort_by(pl.col("Speed")).head(3).list().over("Type 1")

่ฟ™ๆ ทๅฏไปฅ๏ผŒไฝ†ๆ˜ฏ่ฟ™ๆ ทไผš่ฟ”ๅ›žไธ€ไธช็ฑปๅž‹ไธบ List ็š„ๅˆ—๏ผŒ่ฟ™ๅฏ่ƒฝไธๆ˜ฏๆˆ‘ไปฌๆƒณ่ฆ็š„๏ผŒ่€Œไธ”ไผšๅขžๅŠ ๅ†…ๅญ˜ไฝฟ็”จใ€‚

่ฟ™ๆ˜ฏๆˆ‘ไปฌๅฏไปฅ้‡‡็”จ flattenใ€‚่ฟ™ไธชๅ‡ฝๆ•ฐไผšๆŠŠไธ€ไธช 2D ๅˆ—่กจ่ฝฌๆขๆˆ 1D๏ผŒ็„ถๅŽๆŠŠๅˆ—ๆŠ•ๅฐ„ๅˆฐๆˆ‘ไปฌ็š„ DataFrameใ€‚ ่ฟ™ไธชๆ“ไฝœ้žๅธธๅฟซ๏ผŒๅ› ไธบ reshape ๅŸบๆœฌๆฒกๆœ‰ๆˆๆœฌ๏ผŒ็ป™ๅŽŸๆœ‰ DataFrame ๅขžๅŠ ๅˆ—ไนŸ้žๅธธๅฟซ๏ผŒๅ› ไธบๆˆ‘ไปฌไธ้œ€่ฆ ไธ€่ˆฌ็ช—ๅฃๅ‡ฝๆ•ฐ็š„่”ๅˆ๏ผˆJoin๏ผ‰ๆ“ไฝœใ€‚

ไฝ†ๆ˜ฏ๏ผŒๆƒณ่ฆๆญฃ็กฎ็š„ไฝฟ็”จ่ฟ™ไธชๆ“ไฝœ๏ผŒๆˆ‘ไปฌ่ฆไฟ่ฏ็”จไบŽ over ็š„ๅˆ—ๆ˜ฏๆœ‰ๅบ็š„ใ€‚

ๅŸบไบŽ MIT ่ฎธๅฏๅ‘ๅธƒ ๅ…ฑๅปบ ๅ…ฑไบซ ๅ…ฑ็ฎก