小编Qua*_*sto的帖子

熊猫转换列表不一致的行为

我有可以按预期工作的示例代码段:

import pandas as pd

df = pd.DataFrame(data={'label': ['a', 'b', 'b', 'c'], 'wave': [1, 2, 3, 4], 'y': [0,0,0,0]})
df['new'] = df.groupby(['label'])[['wave']].transform(tuple)
Run Code Online (Sandbox Code Playgroud)

结果是:

  label  wave  y     new
0     a     1  0    (1,)
1     b     2  0  (2, 3)
2     b     3  0  (2, 3)
3     c     4  0    (4,)
Run Code Online (Sandbox Code Playgroud)

如果不是,tuple我给出set, frozenset, dict,它会以类似的方式工作,但是如果给出,list我将得到完全出乎意料的结果:

df['new'] = df.groupby(['label'])[['wave']].transform(list)

  label  wave  y  new
0     a     1  0    1
1     b     2  0    2
2     b     3  0    3 …
Run Code Online (Sandbox Code Playgroud)

python transform pandas pandas-groupby

16
推荐指数
2
解决办法
605
查看次数

极坐标对列表列中的元素进行计数

我的数据框包含带有列表元素的b列,我需要创建c列来计算列表中每一行的元素数量。这是 Pandas 中的玩具示例:

import pandas as pd

df = pd.DataFrame({'a': [1,2,3], 'b':[[1,2,3], [2], [5,0]]})

    a   b
0   1   [1, 2, 3]
1   2   [2]
2   3   [5, 0]

df.assign(c=df['b'].str.len())

    a   b           c
0   1   [1, 2, 3]   3
1   2   [2]         1
2   3   [5, 0]      2

Run Code Online (Sandbox Code Playgroud)

这是我在 Polars 中的等效项:

import polars as pl

dfp = pl.DataFrame({'a': [1,2,3], 'b':[[1,2,3], [2], [5,0]]})

dfp.with_columns(pl.col('b').apply(lambda x: len(x)).alias('c'))

Run Code Online (Sandbox Code Playgroud)

我有一种感觉,这.apply(lambda x: len(x))不是最佳状态。

在 Polars 中有更好的方法吗?

python pandas python-polars

5
推荐指数
1
解决办法
2145
查看次数

Polars 将性能应用于自定义功能

除了一种情况外,我很享受 Polars 比 Pandas 的显着加速。我是 Polars 的新手,所以这可能只是我的错误用法。无论如何,这里是玩具示例:在单列上,我需要在我的情况下应用自定义函数,它来自parseprobablypeoplehttps://github.com/datamade/probablepeople),但问题是通用的。

Plain pandasapply与 Polars 具有相似的运行时间,但是带有parallel_applyfrom ( https://github.com/nalepae/pandaralel ) 的 pandas 的加速与核心数量成正比。

在我看来,Polars 仅使用单核来实现自定义功能,或者我错过了什么?

如果我正确使用 Polars,也许有可能创建像pandaralellPolars 这样的工具?

!pip install probablepeople
!pip install pandarallel

import pandas as pd
import probablepeople as pp
import polars as pl
from pandarallel import pandarallel

AMOUNT = 1000_000
#Pandas:
df = pd.DataFrame({'a': ["Mr. Joe Smith"]})
df = df.loc[df.index.repeat(AMOUNT)].reset_index(drop=True)

df['b'] = df['a'].apply(pp.parse)

#Pandarallel:
pandarallel.initialize(progress_bar=True)
df['b_multi'] = df['a'].parallel_apply(pp.parse)

#Polars:
dfp = …
Run Code Online (Sandbox Code Playgroud)

apply pandas python-polars

2
推荐指数
1
解决办法
1636
查看次数