我有可以按预期工作的示例代码段:
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) 我的数据框包含带有列表元素的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 中有更好的方法吗?
除了一种情况外,我很享受 Polars 比 Pandas 的显着加速。我是 Polars 的新手,所以这可能只是我的错误用法。无论如何,这里是玩具示例:在单列上,我需要在我的情况下应用自定义函数,它来自parse库probablypeople(https://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)