首页 > 解决方案 > Krangl:计算列中包含在另一个列表中的元素数

问题描述

我正在使用 Krangl 库,因为我想做简单的探索性数据分析。我想计算来自其他数组的样本数。我有以下代码

    val df: DataFrame = dataFrameOf(
            "structure", "biome", "layer18")(
            "mansion", "dark_forest", "ocean",
            "mansion", "dark_forest", "dark_forest",
            "mansion", "dark_forest_hills", "dark_forest",
            "mansion", "dark_forest", "ocean",
            "temple", "desert", "desert"
    )

    val sum = df.summarize(
            "biome in dark forest" to {it["biome"].eq("dark_forest").count{ it } + it["biome"].eq("dark_forest_hills").count{ it }},
            "layer18 dark forest or ocean" to {it["biome"].eq("dark_forest").count{ it } + it["biome"].eq("ocean").count{ it }}
    )

    println(df)
    println(sum)

哪个输出

A DataFrame: 5 x 3
    structure               biome       layer18
1     mansion         dark_forest         ocean
2     mansion         dark_forest   dark_forest
3     mansion   dark_forest_hills   dark_forest
4     mansion         dark_forest        plains
5      temple              desert        desert
A DataFrame: 1 x 2
    biome in dark forest   layer18 dark forest or ocean
1                      4                              3

但我不喜欢我需要为要检查的每个元素都有表达式。因为我要比较的值列表可以有可变大小。

在纯 kotlin 中,我会写

df["biome"].asStrings().map { it in listOf("dark_forest", "dark_forest_hills") }.map { if (it) 1 else 0 }.sum()

或者

df["biome"].asStrings().sumBy { if(it in listOf("dark_forest", "dark_forest_hills")) 1 else 0 }

但我想正确地、地道地使用 krangl 并跳出来和 krangl 似乎不正确。

另外,在熊猫中,我会做某事。喜欢df['biome'].isin(["dark_forest", "dark_forest_hills"]).sum(),但我在 krangl 中找不到这样的功能。

我应该如何在 krangl 中做到这一点?

标签: dataframekotlin

解决方案


这似乎有效:

df.filter { it["biome"].isMatching<String> { it as String in  setOf("dark_forest", "dark_forest_hill") } }

推荐阅读