如何在python中从numpy数组填充polars Dataframe

vcirk6k6  于 2023-03-23  发布在  Python
关注(0)|答案(1)|浏览(243)

我目前正在开发一个dataframe函数,该函数使用Python中的polars库将shape为2的numpy数组的值分配给dataframe的给定列。
我有一个dataframe df,其中包含以下列:列'HZ'采用[0, EC + H - 1]中的值,列'FL'采用[1, F]中的值。
我还有一个numpy数组q,形状为(EC + H, F),我想用这种方式将它的值赋给列'Q':如果df ['HZ']〉= EC,则df ['Q'] = q[df ['HZ']][df ['F'] -1]。
你可以在下面的pandas指令中找到我想做的事情。
df.loc[df['HZ'] >= EC, 'Q'] = q[df.loc[df['HZ'] >= EC, 'HZ'], df.loc[df['HZ'] >= EC, 'F'] - 1]
现在我想用polars来做,我试着这样做:
df = df.with_columns(pl.when(pl.col('HZ') >= EC).then(q[pl.col('HZ')][pl.col('F') - 1]).otherwise(pl.col('Q')).alias('Q'))
我得到了以下错误:
x1米11米1x
我知道我没有给予numpy好的索引格式来获取数组中的相应值,但我不知道如何替换它来获得所需的行为。
先谢谢你

z4bn682m

z4bn682m1#

我所说的测试用例/示例是指:

df = pl.DataFrame({
    "HZ": [0, 0, 1, 1], 
    "FL": [0, 1, 2, 3], 
    "Q": [0, 0, 0, 0]
})
q = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
EC = 1
>>> df
shape: (4, 3)
┌─────┬─────┬─────┐
│ HZ  ┆ FL  ┆ Q   │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 0   ┆ 0   ┆ 0   │
│ 0   ┆ 1   ┆ 0   │
│ 1   ┆ 2   ┆ 0   │
│ 1   ┆ 3   ┆ 0   │
└─────┴─────┴─────┘

您尝试的方法的问题是q[pl.col('HZ').with_columns执行之前发生,并且numpy无法理解pl.col('HZ')
使用实际值索引numpy数组的一种方法是使用.map
一个二个一个一个
这样做有点尴尬--最好是让你的数据以一种更好的极性格式,例如另一个 Dataframe 。

df_q = pl.DataFrame(
   ((row, col, value) for (row, col), value in np.ndenumerate(q)),
   schema=["HZ", "FL", "Q"]
)
>>> df_q
shape: (8, 3)
┌─────┬─────┬─────┐
│ HZ  ┆ FL  ┆ Q   │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 0   ┆ 0   ┆ 1   │
│ 0   ┆ 1   ┆ 2   │
│ 0   ┆ 2   ┆ 3   │
│ 0   ┆ 3   ┆ 4   │
│ 1   ┆ 0   ┆ 5   │
│ 1   ┆ 1   ┆ 6   │
│ 1   ┆ 2   ┆ 7   │
│ 1   ┆ 3   ┆ 8   │
└─────┴─────┴─────┘

这将允许您使用更常规的方法来匹配值,例如.join

df.join(df_q.with_columns(pl.col("FL") + 1), on=["HZ", "FL"], how="left")
shape: (4, 4)
┌─────┬─────┬─────┬─────────┐
│ HZ  ┆ FL  ┆ Q   ┆ Q_right │
│ --- ┆ --- ┆ --- ┆ ---     │
│ i64 ┆ i64 ┆ i64 ┆ i64     │
╞═════╪═════╪═════╪═════════╡
│ 0   ┆ 0   ┆ 0   ┆ null    │
│ 0   ┆ 1   ┆ 0   ┆ 1       │
│ 1   ┆ 2   ┆ 0   ┆ 6       │
│ 1   ┆ 3   ┆ 0   ┆ 7       │
└─────┴─────┴─────┴─────────┘

相关问题