如何使用 groupby 并应用 Polars

jbs*_*ssm 16 python pandas pandas-groupby python-polars

我正在绞尽脑汁地试图弄清楚如何在Python的极坐标库中使用groupbyand 。apply

来自 Pandas,我使用的是:

def get_score(df):
   return spearmanr(df["prediction"], df["target"]).correlation

correlations = df.groupby("era").apply(get_score)
Run Code Online (Sandbox Code Playgroud)

但在极地,这不起作用。

我尝试了几种方法,主要是:

correlations = df.groupby("era").apply(get_score)
Run Code Online (Sandbox Code Playgroud)

但这失败并出现错误消息:

'可以获取 DataFrame 属性'_df'。确保返回 DataFrame 对象。: PyErr { type: <class 'AttributeError'>, value: AttributeError("'numpy.float64' object has no attribute '_df'"),

有任何想法吗?

rit*_*e46 24

polars>=0.10.4可以使用该pl.spearman_rank_corr功能。

\n

如果你想使用自定义函数,你可以这样做:

\n

多列/表达式上的自定义函数

\n
import polars as pl\nfrom typing import List\nfrom scipy import stats\n\ndf = pl.DataFrame({\n    "g": [1, 1, 1, 2, 2, 2, 5],\n    "a": [2, 4, 5, 190, 1, 4, 1],\n    "b": [1, 3, 2, 1, 43, 3, 1]\n})\n\ndef get_score(args: List[pl.Series]) -> pl.Series:\n    return pl.Series([stats.spearmanr(args[0], args[1]).correlation], dtype=pl.Float64)\n\n(df.group_by("g", maintain_order=True)\n .agg(\n    pl.apply(\n        exprs=["a", "b"], \n        function=get_score).alias("corr")\n ))\n
Run Code Online (Sandbox Code Playgroud)\n

Polars 提供的功能

\n
(df.group_by("g", maintain_order=True)\n .agg(\n     pl.spearman_rank_corr("a", "b").alias("corr")\n ))\n
Run Code Online (Sandbox Code Playgroud)\n

两者输出:

\n
shape: (3, 2)\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 g   \xe2\x94\x86 corr \xe2\x94\x82\n\xe2\x94\x82 --- \xe2\x94\x86 ---  \xe2\x94\x82\n\xe2\x94\x82 i64 \xe2\x94\x86 f64  \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 1   \xe2\x94\x86 0.5  \xe2\x94\x82\n\xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n\xe2\x94\x82 2   \xe2\x94\x86 -1e0 \xe2\x94\x82\n\xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n\xe2\x94\x82 5   \xe2\x94\x86 NaN  \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

单列/表达式上的自定义函数

\n

.apply我们还可以通过或在单个表达式上应用自定义函数.map

\n

下面的示例说明了如何使用自定义函数和普通极坐标表达式对列求平方。表达式语法应该始终是首选,因为它要快得多。

\n
shape: (3, 2)\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 g   \xe2\x94\x86 corr \xe2\x94\x82\n\xe2\x94\x82 --- \xe2\x94\x86 ---  \xe2\x94\x82\n\xe2\x94\x82 i64 \xe2\x94\x86 f64  \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 1   \xe2\x94\x86 0.5  \xe2\x94\x82\n\xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n\xe2\x94\x82 2   \xe2\x94\x86 -1e0 \xe2\x94\x82\n\xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n\xe2\x94\x82 5   \xe2\x94\x86 NaN  \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

apply和 和有什么区别map

\n

map适用于整个列seriesapply适用于单个值或单个组,具体取决于上下文。

\n
select语境:
\n
    \n
  • map\n
      \n
    • 输入/输出类型:Series
    • \n
    • 输入的语义:列值
    • \n
    \n
  • \n
  • apply\n
      \n
    • 输入/输出类型:Union[int, float, str, bool]
    • \n
    • 输入的语义含义:列中的单个值
    • \n
    \n
  • \n
\n
group_by语境:
\n
    \n
  • map\n
      \n
    • 输入/输出类型:Series
    • \n
    • 输入的语义含义:列表列,其中值是组
    • \n
    \n
  • \n
  • apply\n
      \n
    • 输入/输出类型:Series
    • \n
    • 输入的语义含义:组
    • \n
    \n
  • \n
\n