如何分组然后与极坐标交叉连接?

问题描述 投票:0回答:1

我开始使用极坐标,并且仍在学习语法。

我想实现一个groupby,然后是一个交叉连接(笛卡尔积),我想在每个组内的每个组合之间运行计算。 (也可以理解为条件连接)。

我在下面得到了一个示例数据框:

import polars as pl

df = pl.DataFrame(
    {
        "garment": ["tshirt", "tshirt", "tshirt", "pants", "pants", "pants", "socks", "socks", "socks"],
        "color": ["red", "blue", "green", "yellow", "orange", "purple", "black", "white", "grey"],
        "price": [100, 50, 75, 101, 51, 69, 99, 44, 32]
    }
)
print(df)

我弄清楚了如何选择一组(在本例中:所有裤子),以及如何计算所有商品之间的价格差异。

# for one group
df_pants = df.filter(pl.col('garment') == 'pants')
df_pants.join(df_pants, how="cross").filter(
    pl.col('color') != pl.col('color_right') # avoid self-joins
  ).with_columns(
    (pl.col('price') - pl.col('price_right')).abs().alias('difference')
)

但我想编写一个极坐标表达式,首先按“服装”对整个数据集进行分组,然后在每个组内执行连接;最后运行计算(在本例中为价格差异)。

如有任何帮助,我们将不胜感激!

编辑:

此外,我只想拥有独特的组合。所以只有“橙”和“黄”,而不是“黄”和“橙”。

python dataframe python-polars
1个回答
2
投票

更新:

.join_where()
已添加。

您可以将“过滤器”放在连接谓词中。

df.join_where(df, 
   pl.col.garment == pl.col.garment_right,
   pl.col.index < pl.col.index_right
)

您可以在

garment
列上执行自连接。

如果在加入之前添加行索引,则可以在过滤条件中使用它来防止“重复”。

df = df.with_row_index()

(df.join(df, on="garment")
   .filter(pl.col.index < pl.col.index_right)
)
shape: (9, 7)
┌───────┬─────────┬────────┬───────┬─────────────┬─────────────┬─────────────┐
│ index ┆ garment ┆ color  ┆ price ┆ index_right ┆ color_right ┆ price_right │
│ ---   ┆ ---     ┆ ---    ┆ ---   ┆ ---         ┆ ---         ┆ ---         │
│ u32   ┆ str     ┆ str    ┆ i64   ┆ u32         ┆ str         ┆ i64         │
╞═══════╪═════════╪════════╪═══════╪═════════════╪═════════════╪═════════════╡
│ 0     ┆ tshirt  ┆ red    ┆ 100   ┆ 1           ┆ blue        ┆ 50          │
│ 0     ┆ tshirt  ┆ red    ┆ 100   ┆ 2           ┆ green       ┆ 75          │
│ 1     ┆ tshirt  ┆ blue   ┆ 50    ┆ 2           ┆ green       ┆ 75          │
│ 3     ┆ pants   ┆ yellow ┆ 101   ┆ 4           ┆ orange      ┆ 51          │
│ 3     ┆ pants   ┆ yellow ┆ 101   ┆ 5           ┆ purple      ┆ 69          │
│ 4     ┆ pants   ┆ orange ┆ 51    ┆ 5           ┆ purple      ┆ 69          │
│ 6     ┆ socks   ┆ black  ┆ 99    ┆ 7           ┆ white       ┆ 44          │
│ 6     ┆ socks   ┆ black  ┆ 99    ┆ 8           ┆ grey        ┆ 32          │
│ 7     ┆ socks   ┆ white  ┆ 44    ┆ 8           ┆ grey        ┆ 32          │
└───────┴─────────┴────────┴───────┴─────────────┴─────────────┴─────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.