将 Pandas pivot_table 函数转换为 Polars 枢轴函数
Convert Pandas pivot_table function into Polars pivot Function
我正在尝试将一些 python pandas 转换为极坐标。我一直在尝试将 pandas pivot_table 函数转换为极坐标。以下是工作 pandas 代码。我似乎无法通过 Polars 枢轴函数获得相同的行为。 polars pivot 函数强制使用列参数并将列值用作 headers 而不是将列标签用作 header。我将在下面获得相同的输出,但使用 Polars 而不是 Pandas.
df = pd.DataFrame({"obj" : ["ring", "shoe", "ring"], "price":["65", "42", "65"], "value":["53", "55", "54"], "date":["2022-02-07", "2022-01-07", "2022-03-07"]})
table = pd.pivot_table(df, values=['price','value','date'],index=['obj'], aggfunc={'price': pd.Series.nunique,'value':pd.Series.nunique,'date':pd.Series.nunique})
print(table)
输出如下:
date price value
obj
ring 2 1 2
shoe 1 1 1
在 Polars 中,我们不会为此使用枢轴 table。相反,我们将使用 groupby
和 agg
函数。使用您的数据,它将是:
import polars as pl
df = pl.from_pandas(df)
df.groupby("obj").agg(pl.all().n_unique())
shape: (2, 4)
┌──────┬───────┬───────┬──────┐
│ obj ┆ price ┆ value ┆ date │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ u32 ┆ u32 ┆ u32 │
╞══════╪═══════╪═══════╪══════╡
│ ring ┆ 1 ┆ 2 ┆ 2 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ shoe ┆ 1 ┆ 1 ┆ 1 │
└──────┴───────┴───────┴──────┘
旋转并融化
我们在 Polars 中使用 pivot
函数的地方是将 'long' 格式的数据集汇总为 'wide' 格式的数据集。例如,让我们使用 melt
函数将原始数据集转换为 'long' 格式。
df2 = df.melt(id_vars="obj", value_vars=["price", "date", "value"])
print(df2)
shape: (9, 3)
┌──────┬──────────┬────────────┐
│ obj ┆ variable ┆ value │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞══════╪══════════╪════════════╡
│ ring ┆ price ┆ 65 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ shoe ┆ price ┆ 42 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ price ┆ 65 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ date ┆ 2022-02-07 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ shoe ┆ date ┆ 2022-01-07 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ date ┆ 2022-03-07 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ value ┆ 53 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ shoe ┆ value ┆ 55 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ value ┆ 54 │
└──────┴──────────┴────────────┘
现在让我们使用 pivot
将这个 'long' 格式的数据集归纳为一个“宽”格式,并简单地计算值的数量。
df2.pivot(values='value', index='obj', columns='variable', aggregate_fn='count')
shape: (2, 4)
┌──────┬──────┬───────┬───────┐
│ obj ┆ date ┆ price ┆ value │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ u32 ┆ u32 ┆ u32 │
╞══════╪══════╪═══════╪═══════╡
│ ring ┆ 2 ┆ 2 ┆ 2 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ shoe ┆ 1 ┆ 1 ┆ 1 │
└──────┴──────┴───────┴───────┘
这是否有助于阐明 pivot
功能的使用?
我正在尝试将一些 python pandas 转换为极坐标。我一直在尝试将 pandas pivot_table 函数转换为极坐标。以下是工作 pandas 代码。我似乎无法通过 Polars 枢轴函数获得相同的行为。 polars pivot 函数强制使用列参数并将列值用作 headers 而不是将列标签用作 header。我将在下面获得相同的输出,但使用 Polars 而不是 Pandas.
df = pd.DataFrame({"obj" : ["ring", "shoe", "ring"], "price":["65", "42", "65"], "value":["53", "55", "54"], "date":["2022-02-07", "2022-01-07", "2022-03-07"]})
table = pd.pivot_table(df, values=['price','value','date'],index=['obj'], aggfunc={'price': pd.Series.nunique,'value':pd.Series.nunique,'date':pd.Series.nunique})
print(table)
输出如下:
date price value
obj
ring 2 1 2
shoe 1 1 1
在 Polars 中,我们不会为此使用枢轴 table。相反,我们将使用 groupby
和 agg
函数。使用您的数据,它将是:
import polars as pl
df = pl.from_pandas(df)
df.groupby("obj").agg(pl.all().n_unique())
shape: (2, 4)
┌──────┬───────┬───────┬──────┐
│ obj ┆ price ┆ value ┆ date │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ u32 ┆ u32 ┆ u32 │
╞══════╪═══════╪═══════╪══════╡
│ ring ┆ 1 ┆ 2 ┆ 2 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ shoe ┆ 1 ┆ 1 ┆ 1 │
└──────┴───────┴───────┴──────┘
旋转并融化
我们在 Polars 中使用 pivot
函数的地方是将 'long' 格式的数据集汇总为 'wide' 格式的数据集。例如,让我们使用 melt
函数将原始数据集转换为 'long' 格式。
df2 = df.melt(id_vars="obj", value_vars=["price", "date", "value"])
print(df2)
shape: (9, 3)
┌──────┬──────────┬────────────┐
│ obj ┆ variable ┆ value │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞══════╪══════════╪════════════╡
│ ring ┆ price ┆ 65 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ shoe ┆ price ┆ 42 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ price ┆ 65 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ date ┆ 2022-02-07 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ shoe ┆ date ┆ 2022-01-07 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ date ┆ 2022-03-07 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ value ┆ 53 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ shoe ┆ value ┆ 55 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ ring ┆ value ┆ 54 │
└──────┴──────────┴────────────┘
现在让我们使用 pivot
将这个 'long' 格式的数据集归纳为一个“宽”格式,并简单地计算值的数量。
df2.pivot(values='value', index='obj', columns='variable', aggregate_fn='count')
shape: (2, 4)
┌──────┬──────┬───────┬───────┐
│ obj ┆ date ┆ price ┆ value │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ u32 ┆ u32 ┆ u32 │
╞══════╪══════╪═══════╪═══════╡
│ ring ┆ 2 ┆ 2 ┆ 2 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ shoe ┆ 1 ┆ 1 ┆ 1 │
└──────┴──────┴───────┴───────┘
这是否有助于阐明 pivot
功能的使用?