


Bagaimana untuk membuat lajur berdasarkan penapis baris DataFrame lain?
Saya mempunyai kerangka malas yang dipanggil "data_jam" yang mengandungi lajur waktu tarikh setiap jam yang dipanggil "masa". Saya juga mempunyai bingkai data yang dipanggil "masa hadapan_masa" yang mengandungi dua lajur masa tarikh yang dipanggil "mula" (masa mula tempoh masa hadapan) dan "akhir" (masa tamat tempoh masa hadapan). Yang penting, tempoh masa hadapan ini tidak bertindih.
Saya ingin mencipta lajur yang dipanggil "tempoh" untuk lazyframe data_jam, ia harus mempunyai nilai int berdasarkan tempoh mana (baris rangka data masa hadapan_masa, dari 0 hingga 9 jika terdapat 10 titik) nilai lajur masa bagi data_jam Nilai adalah antara nilai lajur mula dan tamat tempoh_masa hadapan.
Saya cuba melakukan perkara berikut:
periods = pl.series(range(future_periods.height)) hourly_data = hourly_data.with_columns( ( pl.when(((future_periods.get_column('start') <= pl.col('time')) & (pl.col('time') <= future_periods.get_column('end'))).any()) .then(periods.filter(pl.series((future_periods.get_column('start') <= pl.col('real_time')) & (pl.col('real_time') <= future_periods.get_column('end')))).to_list()[0]) .otherwise(none) ).alias('period') )
Tetapi ini memberi saya ralat: typeerror: Memanggil pembina siri dengan jenis 'expr' yang tidak disokong untuk values
hujah
Apa yang saya ingin capai: Input:
hourly_data: ┌────────────────────┐ │ time │ │ --- │ │ datetime │ ╞════════════════════╡ │ 2024-01-01 00:00:00│ │ 2024-01-01 01:00:00│ │ 2024-01-01 02:00:00│ │ ... │ │ 2024-03-31 23:00:00│ │ 2024-04-01 00:00:00│ │ 2024-04-01 01:00:00│ │ ... │ │ 2024-06-01 00:00:00│ └────────────────────┘ future_periods: ┌─────────────────────────┬───────────────────────┐ │ start ┆ end │ │ --- ┆ --- │ │ datetime ┆ datetime │ ╞═════════════════════════╪═══════════════════════╡ │ 2024-01-01 00:00:00 ┆ 2024-01-31 23:00:00 │ │ 2024-02-01 00:00:00 ┆ 2024-02-28 23:00:00 │ │ 2024-03-01 00:00:00 ┆ 2024-03-31 23:00:00 │ │ 2024-04-01 00:00:00 ┆ 2024-05-31 23:00:00 │ └─────────────────────────┴───────────────────────┘
Keluaran:
hourly_data: ┌─────────────────────────┬────────┐ │ time ┆ period │ │ --- ┆ --- │ │ datetime ┆ int │ ╞═════════════════════════╪════════╡ │ 2024-01-01 00:00:00 ┆ 0 │ │ 2024-01-01 01:00:00 ┆ 0 │ │ 2024-01-01 02:00:00 ┆ 0 │ │ ... ┆ ... │ │ 2024-03-31 23:00:00 ┆ 2 │ │ 2024-04-01 00:00:00 ┆ 3 │ │ 2024-04-01 01:00:00 ┆ 3 │ │ ... ┆ ... │ │ 2024-06-01 00:00:00 ┆ None │ └─────────────────────────┴────────┘
Jawapan betul
Secara amnya, ia adalah gabungan ketidaksamaan, atau dalam kes anda, gabungan julat. Berikut ialah satu cara untuk melakukannya. Mari mulakan dengan mencipta beberapa sampel data:
hourly_data = pl.dataframe({ "time": ['2023-01-01 14:00','2023-01-02 09:00', '2023-01-04 11:00'] }).lazy() future_periods = pl.dataframe({ "id": [1,2,3,4], "start": ['2023-01-01 11:00','2023-01-02 10:00', '2023-01-03 15:00', '2023-01-04 10:00'], "end": ['2023-01-01 16:00','2023-01-02 11:00', '2023-01-03 18:00', '2023-01-04 15:00'] }).lazy() ┌──────────────────┬──────┐ │ time ┆ data │ │ --- ┆ --- │ │ str ┆ str │ ╞══════════════════╪══════╡ │ 2023-01-01 14:00 ┆ a │ │ 2023-01-02 09:00 ┆ b │ │ 2023-01-04 11:00 ┆ c │ └──────────────────┴──────┘ ┌─────┬──────────────────┬──────────────────┐ │ id ┆ start ┆ end │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ str │ ╞═════╪══════════════════╪══════════════════╡ │ 1 ┆ 2023-01-01 11:00 ┆ 2023-01-01 16:00 │ │ 2 ┆ 2023-01-02 10:00 ┆ 2023-01-02 11:00 │ │ 3 ┆ 2023-01-03 15:00 ┆ 2023-01-03 18:00 │ │ 4 ┆ 2023-01-04 10:00 ┆ 2023-01-04 15:00 │ └─────┴──────────────────┴──────────────────┘
Kini anda boleh melakukannya dalam dua langkah - pertama, kira pautan antara time
和未来时段 id
:
time_periods = ( hourly_data .join(future_periods, how="cross") .filter( pl.col("time") > pl.col("start"), pl.col("time") < pl.col("end") ).select(["time","id"]) ) ┌──────────────────┬─────┐ │ time ┆ id │ │ --- ┆ --- │ │ str ┆ i64 │ ╞══════════════════╪═════╡ │ 2023-01-01 14:00 ┆ 1 │ │ 2023-01-04 11:00 ┆ 4 │ └──────────────────┴─────┘
Anda kemudian boleh menyertainya dengan bingkai data asal:
hourly_data.join(time_periods, how="left", on="time").collect() ┌──────────────────┬──────┬──────┐ │ time ┆ data ┆ id │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 │ ╞══════════════════╪══════╪══════╡ │ 2023-01-01 14:00 ┆ a ┆ 1 │ │ 2023-01-02 09:00 ┆ b ┆ null │ │ 2023-01-04 11:00 ┆ c ┆ 4 │ └──────────────────┴──────┴──────┘
Cara lain untuk melakukan ini mungkin menggunakan penyepaduan duckdb
感谢 与 polars
:
import duckdb import polars as pl duckdb.sql(""" select h.time, h.data, p.id from hourly_data as h left join future_periods as p on p.start < h.time and p.end > h.time """).pl() ┌──────────────────┬──────┬──────┐ │ time ┆ data ┆ id │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 │ ╞══════════════════╪══════╪══════╡ │ 2023-01-01 14:00 ┆ A ┆ 1 │ │ 2023-01-04 11:00 ┆ C ┆ 4 │ │ 2023-01-02 09:00 ┆ B ┆ null │ └──────────────────┴──────┴──────┘
Atas ialah kandungan terperinci Bagaimana untuk membuat lajur berdasarkan penapis baris DataFrame lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Penyelesaian kepada Isu Kebenaran Semasa Melihat Versi Python di Terminal Linux Apabila anda cuba melihat versi Python di Terminal Linux, masukkan Python ...

Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam masa 10 jam? Sekiranya anda hanya mempunyai 10 jam untuk mengajar pemula komputer beberapa pengetahuan pengaturcaraan, apa yang akan anda pilih untuk mengajar ...

Cara mengelakkan dikesan semasa menggunakan fiddlerevery di mana untuk bacaan lelaki-dalam-pertengahan apabila anda menggunakan fiddlerevery di mana ...

Apabila menggunakan Perpustakaan Pandas Python, bagaimana untuk menyalin seluruh lajur antara dua data data dengan struktur yang berbeza adalah masalah biasa. Katakan kita mempunyai dua DAT ...

Bagaimanakah Uvicorn terus mendengar permintaan HTTP? Uvicorn adalah pelayan web ringan berdasarkan ASGI. Salah satu fungsi terasnya ialah mendengar permintaan HTTP dan teruskan ...

Fastapi ...

Di Python, bagaimana untuk membuat objek secara dinamik melalui rentetan dan panggil kaedahnya? Ini adalah keperluan pengaturcaraan yang biasa, terutamanya jika perlu dikonfigurasikan atau dijalankan ...

Menggunakan Python di Terminal Linux ...
