就说我有

df = pl.DataFrame({
    'a': [1, 2, 1],
    'b': [2, 1, 2],
    'c': [3, 3, 2],
    'column': ['a', 'c', 'b'],
})
shape: (3, 4)
┌─────┬─────┬─────┬────────┐
│ a   ┆ b   ┆ c   ┆ column │
│ --- ┆ --- ┆ --- ┆ ---    │
│ i64 ┆ i64 ┆ i64 ┆ str    │
╞═════╪═════╪═════╪════════╡
│ 1   ┆ 2   ┆ 3   ┆ a      │
│ 2   ┆ 1   ┆ 3   ┆ c      │
│ 1   ┆ 2   ┆ 2   ┆ b      │
└─────┴─────┴─────┴────────┘

我想添加一列,对于每一行,获取与column中的列对应的行中的值.

预期输出:

shape: (3, 5)
┌─────┬─────┬─────┬────────┬────────┐
│ a   ┆ b   ┆ c   ┆ column ┆ lookup │
│ --- ┆ --- ┆ --- ┆ ---    ┆ ---    │
│ i64 ┆ i64 ┆ i64 ┆ str    ┆ i64    │
╞═════╪═════╪═════╪════════╪════════╡
│ 1   ┆ 2   ┆ 3   ┆ a      ┆ 1      │
│ 2   ┆ 1   ┆ 3   ┆ c      ┆ 3      │
│ 1   ┆ 2   ┆ 2   ┆ b      ┆ 2      │
└─────┴─────┴─────┴────────┴────────┘

推荐答案

即使在列重复的情况下,此操作也有效

df = pl.DataFrame({
    'a': [1, 2, 1,3],
    'b': [2, 1, 2,4],
    'c': [3, 3, 2,5],
    'column': ['a', 'c', 'b','a'],
})
df.with_row_count('i').join(
    df.with_row_count('i')
        .melt(['i','column'], value_name='lookup')
        .filter(pl.col('column')==pl.col('variable'))
        .select('i','lookup'),
    on='i', how='left').sort('i').drop('i')

shape: (4, 5)
┌─────┬─────┬─────┬────────┬────────┐
│ a   ┆ b   ┆ c   ┆ column ┆ lookup │
│ --- ┆ --- ┆ --- ┆ ---    ┆ ---    │
│ i64 ┆ i64 ┆ i64 ┆ str    ┆ i64    │
╞═════╪═════╪═════╪════════╪════════╡
│ 1   ┆ 2   ┆ 3   ┆ a      ┆ 1      │
│ 2   ┆ 1   ┆ 3   ┆ c      ┆ 3      │
│ 1   ┆ 2   ┆ 2   ┆ b      ┆ 2      │
│ 3   ┆ 4   ┆ 5   ┆ a      ┆ 3      │
└─────┴─────┴─────┴────────┴────────┘

这里有另一种不使用melt的方法

df.join(
    df.select(pl.col('column').unique().sort()).with_row_count('i'), 
    on='column'
).with_columns(
    lookup=(pl.concat_list('a','b','c').list.get(pl.col('i')))
).drop('i')

它的工作原理是将‘a’、‘b’、‘c’列转换为列表列,然后使用.get来提取该列表的索引,因为GET将接受一个表达式.要做到这一点,我们首先必须创建一个索引值ABC是什么的查找表.如果现有列与column中的列不完全匹配,它显然会严重崩溃.假设你的数据被提前擦除,那么我认为这会比融化更快.

Python相关问答推荐

如何使用PyTest根据self 模拟具有副作用的属性

使用图片生成PDF Django rest框架

按照行主要蛇扫描顺序对点列表进行排序

如何使用上下文管理器创建类的实例?

Polars:使用列值引用when / then表达中的其他列

Python plt.text中重叠,包adjust_text不起作用,如何修复?

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

如何在BeautifulSoup中链接Find()方法并处理无?

使用numpy提取数据块

对某些列的总数进行民意调查,但不单独列出每列

处理(潜在)不断增长的任务队列的并行/并行方法

用合并列替换现有列并重命名

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

使用setuptools pyproject.toml和自定义目录树构建PyPi包

如何指定列数据类型

如何使regex代码只适用于空的目标单元格

python中csv. Dictreader. fieldname的类型是什么?'

polars:有效的方法来应用函数过滤列的字符串

判断Python操作:如何从字面上得到所有decorator ?

如何从数据框列中提取特定部分并将该值填充到其他列中?