首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python-polars:快速将dataframe列中的列表转换为

Python-polars:快速将dataframe列中的列表转换为
EN

Stack Overflow用户
提问于 2022-06-16 21:37:24
回答 1查看 813关注 0票数 0

我有一张大数据。在groupby操作之后,我有一个字符串列表,它对应于第一列的每个元素。我需要的是能够快速找到某些特定的I行与所有其他行之间的公共字符串。我可以在Pandas中通过将上面的数据文件保存为一个泡菜文件来做到这一点。当加载时间很长时,解是次优的。

然后,我发现极性是有希望的,只是我不能以它支持的任何格式存储数据集列,以便快速加载。因此,这就留下了另一种解决方案,即以列表的形式存储,但在从拼板加载之后,快速地将分组列转换为集合。(我在数据存储和金库方面也面临着同样的问题。)

我发现的极地解决方案是使用.apply。但是它只在一个线程中工作,而且非常慢。我使用的代码如下:

代码语言:javascript
复制
>>> df = pl.read_csv('test.csv')
>>> df
shape: (4, 2)
┌────────┬────────┐
│ ColA   ┆ ColB   │
│ ---    ┆ ---    │
│ str    ┆ str    │
╞════════╪════════╡
│ apple  ┆ boy    │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ orange ┆ ball   │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ apple  ┆ bamboo │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ orange ┆ bull   │
└────────┴────────┘
>>> df = (df.lazy().groupby('ColA').agg([pl.col('ColB').list()])).collect()
>>> df
shape: (2, 2)
┌────────┬───────────────────┐
│ ColA   ┆ ColB              │
│ ---    ┆ ---               │
│ str    ┆ list[str]         │
╞════════╪═══════════════════╡
│ orange ┆ ["ball", "bull"]  │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ apple  ┆ ["boy", "bamboo"] │
└────────┴───────────────────┘
>>> df['ColB'] = df['ColB'].apply(set)
>>> df
shape: (2, 2)
┌────────┬───────────────────┐
│ ColA   ┆ ColB              │
│ ---    ┆ ---               │
│ str    ┆ object            │
╞════════╪═══════════════════╡
│ orange ┆ {'ball', 'bull'}  │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ apple  ┆ {'boy', 'bamboo'} │
└────────┴───────────────────┘
>>>

我在使用discussion时发现了map,但它只适用于系列。与在每个元素基础上工作的示例不同,当我使用np.asarray转换为numpy数组(稍后在它们上应用相交)时,整列排序为数组!

代码语言:javascript
复制
>>> df = (df.lazy().groupby('ColA').agg([pl.col('ColB').list()])).collect()
>>> df
shape: (2, 2)
┌────────┬─────────────────────────┐
│ ColA   ┆ ColB                    │
│ ---    ┆ ---                     │
│ str    ┆ list[str]               │
╞════════╪═════════════════════════╡
│ orange ┆ ["ball", "bull", "boy"] │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ apple  ┆ ["boy", "bamboo"]       │
└────────┴─────────────────────────┘
>>> df.select([pl.all().map(np.asarray)])
shape: (1, 2)
┌────────────────────┬─────────────────────────────────────┐
│ ColA               ┆ ColB                                │
│ ---                ┆ ---                                 │
│ object             ┆ object                              │
╞════════════════════╪═════════════════════════════════════╡
│ ['orange' 'apple'] ┆ [array(['ball', 'bull', 'boy'], ... │
└────────────────────┴─────────────────────────────────────┘
>>>

我想知道我哪里出错了,以及如何使用多线程(与map一样)将列表的一列转换为numpy数组的列(最好是设置)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-16 22:14:23

也许不是最好的方法,但下面的方法效果相当好。

代码语言:javascript
复制
>>> my_dict = dict(df.to_numpy().tolist())
>>> my_dict
{'orange': array(['ball', 'bull', 'boy'], dtype=object), 'apple': array(['boy', 'bamboo'], dtype=object)}
>>> for i in my_dict:
...     my_dict[i] = set(my_dict[i])
...
>>> my_dict
{'orange': {'ball', 'boy', 'bull'}, 'apple': {'bamboo', 'boy'}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72652147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档