<
我在极坐标中有这样的表格:
Train | |
---|---|
08:40:10 | 112 |
19:31:26 | 134 |
Polars 有join_asof
它连接到最接近的键forward
或backward
时间。
from datetime import time
df_a = pl.DataFrame({
"arrival_time": [time(8, 40, 10), time(19, 31, 26)],
"train": [112, 134]
})
df_b = pl.DataFrame({
"arrival_time": [time(8), time(16)],
"period": ["early", "afternoon"]
})
print(df_a.join_asof(df_b, on="arrival_time"))
shape: (2, 3)
┌──────────────┬───────┬───────────┐
│ arrival_time ┆ train ┆ period │
│ --- ┆ --- ┆ --- │
│ time ┆ i64 ┆ str │
╞══════════════╪═══════╪═══════════╡
│ 08:40:10 ┆ 112 ┆ early │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
│ 19:31:26 ┆ 134 ┆ afternoon │
└──────────────┴───────┴───────────┘
构建@ritchie46答案,如果您需要找到最接近的值,则可以在向前和向后方向上应用join_asof
,并选择最接近的结果。
例如,如果我们从这些数据开始:
df_a = pl.DataFrame(
{"arrival_time": [time(8, 40, 10), time(8, 59, 0), time(
19, 31, 26)], "train": [112, 113, 134]}
)
df_b = pl.DataFrame(
{
"arrival_time": [
time(8),
time(8, 30, 0),
time(9),
time(16),
time(16, 30, 0),
time(17),
],
"period": [
"early morning",
"mid-morning",
"late morning",
"early afternoon",
"mid afternoon",
"late afternoon",
],
}
)
df_a
df_b
shape: (3, 2)
┌──────────────┬───────┐
│ arrival_time ┆ train │
│ --- ┆ --- │
│ time ┆ i64 │
╞══════════════╪═══════╡
│ 08:40:10 ┆ 112 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ 08:59:00 ┆ 113 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ 19:31:26 ┆ 134 │
└──────────────┴───────┘
>>> df_b
shape: (6, 2)
┌──────────────┬─────────────────┐
│ arrival_time ┆ period │
│ --- ┆ --- │
│ time ┆ str │
╞══════════════╪═════════════════╡
│ 08:00:00 ┆ early morning │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 08:30:00 ┆ mid-morning │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 09:00:00 ┆ late morning │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 16:00:00 ┆ early afternoon │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 16:30:00 ┆ mid afternoon │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 17:00:00 ┆ late afternoon │
└──────────────┴─────────────────┘
我们看到火车113
更接近late morning
而不是mid-morning
。 如果需要捕获它,可以同时加入backward
和forward
,然后选择最接近的:
(
df_a
.join_asof(df_b.with_column(pl.col('arrival_time').alias('early_time')), on="arrival_time", strategy="backward", suffix="_early")
.join_asof(df_b.with_column(pl.col('arrival_time').alias('late_time')), on="arrival_time", strategy="forward", suffix="_late")
.with_column(
pl.when(pl.col('early_time').is_null())
.then(pl.col('period_late'))
.when(pl.col('late_time').is_null())
.then(pl.col('period'))
.when((pl.col('arrival_time').cast(pl.Datetime) - pl.col('early_time').cast(pl.Datetime)) <
(pl.col('late_time').cast(pl.Datetime) - pl.col('arrival_time').cast(pl.Datetime)))
.then(pl.col('period'))
.otherwise(pl.col('period_late'))
.alias('closest')
)
)
shape: (3, 7)
┌──────────────┬───────┬────────────────┬────────────┬──────────────┬───────────┬────────────────┐
│ arrival_time ┆ train ┆ period ┆ early_time ┆ period_late ┆ late_time ┆ closest │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ time ┆ i64 ┆ str ┆ time ┆ str ┆ time ┆ str │
╞══════════════╪═══════╪════════════════╪════════════╪══════════════╪═══════════╪════════════════╡
│ 08:40:10 ┆ 112 ┆ mid-morning ┆ 08:30:00 ┆ late morning ┆ 09:00:00 ┆ mid-morning │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 08:59:00 ┆ 113 ┆ mid-morning ┆ 08:30:00 ┆ late morning ┆ 09:00:00 ┆ late morning │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 19:31:26 ┆ 134 ┆ late afternoon ┆ 17:00:00 ┆ null ┆ null ┆ late afternoon │
└──────────────┴───────┴────────────────┴────────────┴──────────────┴───────────┴────────────────┘
请注意,在when/then/otherwise
中,我选择明确处理火车在第一个周期之前或最后一个周期之后到达的情况。
相关内容
- 比较 Polars 中的 2 个表,并根据该比较选择一个值
- 如何在XPath中使用属性比较选择元素
- JS-比较选择选项,然后将其选中
- 基于多索引比较选择行
- 如何创建比较选择器并正确调度它
- 比较选择中的日期是否在将来
- 在同一张表上进行比较选择(mysql)
- 根据与数组列的比较选择关联的记录
- SQL 根据另一行值和用户输入的比较选择单行项
- SQL:根据两个最新关联记录的比较选择记录
- 比较选择中的不同 ID 以显示正确的选项
- 不正确的逻辑表达式:比较/选择选项后面只能跟"AND"、"OR"或")"
- 是否可能:根据字符串比较选择一个值表单数据表
- 如何比较选择大于其平均值的所有值
- 使用多行数据创建视图以进行比较选择
- 为浮点比较选择Epsilon值
- 比较选择选项
- 根据日期比较选择记录
- Mysql - 根据两列的前三个字母比较选择行
- 尝试枚举数组并根据与用户默认值的比较选择对象
最新更新
- Android Jetpack撰写和导航
- payfort "response_message":"带有标记化的无效命令
- 如何检查我的"npx 安全帽编译"是否正常工作
- OSError: -6在Micropython中进行简单的API调用时
- 带有AND操作符的For循环数组
- 无法从VPC内访问S3桶上托管的静态网站
- 使用Numpy Array在每个像素时间序列的特定位置插入值
- 如何在minikube上部署elasticsearch
- 如何在点击页面导航链接时停止屏幕滚动,React-Bootstrap和Gatsby
- 无法在本地种类群集中装载本地主机路径
- 不能将带有多个对象的文件从React上载到.net Core 5
- 在Python中找到蛋糕的最大块数
- Mongodb:如何将$facet输出2乘以2合并
- 添加https到数组的缺失字符串?
- 如何使用bigquery在带有通配符的字符串列表中测试字符串
- 如何处理Vuex/Pinia商店中的关系并保持同步?
- 如何制作一定大小的列表(k)
- django多对一关系
- Powershell调用- webrequest追加到文件而不是写入
- R difftime()产生不正确的间隔
- SQL查询从两个表中减去值
- r语言 - 如何在闪亮应用的downloadHandler中使用callr::r_bg
- 如何在熊猫数据框行爆炸与逗号分隔的数字,同时留下不变的行与单个数字和没有逗号?
- 使用' modelsummary::datasummary_balance '在' R '中删除' N '
- PHP中使用关联数组的特定任务出现问题
- 按数据框分组并拆分为列
- 使用 Flask 时,为什么要使用 url_for() 方法来提供静态文件?为什么不能只使用相对路径?
- Highcharts本地CSV问题
- 在python龟的比较中超过最大递归深度
- Ionic 6 cordova/capacitor社交分享不支持ios
热门标签:
javascript python java c# php android html jquery c++ css ios sql mysql arrays asp.net json python-3.x ruby-on-rails .net sql-server django objective-c excel regex ruby linux ajax iphone xml vba spring asp.net-mvc database wordpress string postgresql wpf windows xcode bash git oracle list vb.net multithreading eclipse algorithm macos powershell visual-studio image forms numpy scala function api selenium