我有一个带有“col1”列和“col2”列的极坐标数据框。 现在我想对两列进行分组并创建一个新列。我有以下示例数据:
data = {
"col1": [1, 1, 1,1,1,1,1,1,1,1,1,1, 2, 2,2,2,2,2,2,2,2,2,2],
"col2": [
"2022-05-25T08:00:00.648681",
"2022-05-25T08:15:00.648681",
"2022-05-25T08:30:00.648681",
"2022-05-25T08:45:00.648681",
"2022-05-25T09:00:00.648681",
"2022-05-25T09:15:00.648681",
"2022-05-25T09:30:00.648681",
"2022-05-25T09:45:00.648681",
"2022-05-25T10:00:00.648681",
"2022-05-25T10:15:00.648681",
"2022-05-25T10:30:00.648681",
"2022-05-25T10:45:00.648681",
"2022-05-25T08:00:00.648681",
"2022-05-25T08:15:00.648681",
"2022-05-25T08:30:00.648681",
"2022-05-25T08:45:00.648681",
"2022-05-25T09:00:00.648681",
"2022-05-25T06:00:00.648681",
"2022-05-25T06:15:00.648681",
"2022-05-25T06:30:00.648681",
"2022-05-25T06:45:00.648681",
"2022-05-25T07:00:00.648681",
"2022-05-25T07:15:00.648681",
],
}
# Create a DataFrame from the dictionary
df = pl.DataFrame(data)
df = df.with_columns(pl.col("col2").str.to_datetime())
现在我想创建列“col3”,其中“col1”和“col2”按 45 分钟的阈值进行分组。例如,如果 col1 = 1 且 col2 = 在 45 分钟内,则将 col3 的值设置为 1。如果 col1 = 1 且 col2 = 在下一个 45 分钟内,则将 col3 的值设置为 2
所以期望的结果应该是这样的:
┌──────┬────────────────────────────┬──────┐
│ col1 ┆ col2 ┆ col3 │
│ --- ┆ --- ┆ --- │
│ i64 ┆ datetime[μs] ┆ u32 │
╞══════╪════════════════════════════╪══════╡
│ 1 ┆ 2022-05-25 08:00:00.648681 ┆ 1 │
│ 1 ┆ 2022-05-25 08:15:00.648681 ┆ 1 │
│ 1 ┆ 2022-05-25 08:30:00.648681 ┆ 1 │
│ 1 ┆ 2022-05-25 08:45:00.648681 ┆ 1 │
│ 1 ┆ 2022-05-25 09:00:00.648681 ┆ 2 │
│ 1 ┆ 2022-05-25 09:15:00.648681 ┆ 2 │
│ 1 ┆ 2022-05-25 09:30:00.648681 ┆ 2 │
│ 1 ┆ 2022-05-25 09:45:00.648681 ┆ 2 │
│ 1 ┆ 2022-05-25 10:00:00.648681 ┆ 3 │
│ 1 ┆ 2022-05-25 10:15:00.648681 ┆ 3 │
│ 1 ┆ 2022-05-25 10:30:00.648681 ┆ 3 │
│ 1 ┆ 2022-05-25 10:45:00.648681 ┆ 3 │
│ 2 ┆ 2022-05-25 08:00:00.648681 ┆ 3 │
│ 2 ┆ 2022-05-25 08:15:00.648681 ┆ 3 │
│ 2 ┆ 2022-05-25 08:30:00.648681 ┆ 3 │
│ 2 ┆ 2022-05-25 08:45:00.648681 ┆ 3 │
│ 2 ┆ 2022-05-25 09:00:00.648681 ┆ 4 │
│ 2 ┆ 2022-05-25 06:00:00.648681 ┆ 1 │
│ 2 ┆ 2022-05-25 06:15:00.648681 ┆ 1 │
│ 2 ┆ 2022-05-25 06:30:00.648681 ┆ 1 │
│ 2 ┆ 2022-05-25 06:45:00.648681 ┆ 1 │
│ 2 ┆ 2022-05-25 07:00:00.648681 ┆ 2 │
│ 2 ┆ 2022-05-25 07:15:00.648681 ┆ 2 │
└──────┴────────────────────────────┴──────┘
在极地你会怎么做?
我不确定我是否正确理解了这个问题。
从您期望的结果来看,第 3 列似乎在每天和每组的第一个小时从 1 开始。然后每小时增加 1。
如果是这种情况,您可以通过计算小时、组和天的排名来重现它。
with pl.Config(tbl_rows=24):
df.with_columns(
pl.col('col2').dt.hour().rank(method='dense')
.over(pl.col('col1'),pl.col('col2').dt.truncate('1d'))
.alias('col3')
)
shape: (23, 3)
┌──────┬────────────────────────────┬──────┐
│ col1 ┆ col2 ┆ col3 │
│ --- ┆ --- ┆ --- │
│ i64 ┆ datetime[μs] ┆ u32 │
╞══════╪════════════════════════════╪══════╡
│ 1 ┆ 2022-05-25 08:00:00.648681 ┆ 1 │
│ 1 ┆ 2022-05-25 08:15:00.648681 ┆ 1 │
│ 1 ┆ 2022-05-25 08:30:00.648681 ┆ 1 │
│ 1 ┆ 2022-05-25 08:45:00.648681 ┆ 1 │
│ 1 ┆ 2022-05-25 09:00:00.648681 ┆ 2 │
│ 1 ┆ 2022-05-25 09:15:00.648681 ┆ 2 │
│ 1 ┆ 2022-05-25 09:30:00.648681 ┆ 2 │
│ 1 ┆ 2022-05-25 09:45:00.648681 ┆ 2 │
│ 1 ┆ 2022-05-25 10:00:00.648681 ┆ 3 │
│ 1 ┆ 2022-05-25 10:15:00.648681 ┆ 3 │
│ 1 ┆ 2022-05-25 10:30:00.648681 ┆ 3 │
│ 1 ┆ 2022-05-25 10:45:00.648681 ┆ 3 │
│ 2 ┆ 2022-05-25 08:00:00.648681 ┆ 3 │
│ 2 ┆ 2022-05-25 08:15:00.648681 ┆ 3 │
│ 2 ┆ 2022-05-25 08:30:00.648681 ┆ 3 │
│ 2 ┆ 2022-05-25 08:45:00.648681 ┆ 3 │
│ 2 ┆ 2022-05-25 09:00:00.648681 ┆ 4 │
│ 2 ┆ 2022-05-25 06:00:00.648681 ┆ 1 │
│ 2 ┆ 2022-05-25 06:15:00.648681 ┆ 1 │
│ 2 ┆ 2022-05-25 06:30:00.648681 ┆ 1 │
│ 2 ┆ 2022-05-25 06:45:00.648681 ┆ 1 │
│ 2 ┆ 2022-05-25 07:00:00.648681 ┆ 2 │
│ 2 ┆ 2022-05-25 07:15:00.648681 ┆ 2 │
└──────┴────────────────────────────┴──────┘
代码详情:
pl.col('col2').dt.hour()
返回一天中的小时
pl.col('col2').dt.truncate('1d')
返回日期
.rank(method='dense').over()
计算特定周长内的排名。这是一个窗口函数。
这就是你想要实现的目标吗?