如何在Julia DataFrame中按多国家组合拆分分配分数?
解决DataFrame中组合国家的分数拆分求和问题
核心思路
将包含/的组合国家拆分为单个国家,把原分数按拆分后的国家数量平均分配,再按单个国家分组求和。
完整实现代码
首先构造测试数据(和你的数据一致):
using DataFrames db_test = DataFrame( Name = ["Oliver", "Patrick", "Jules", "Steven", "Karl", "Alexander", "Julian"], Score = [5.0, 3.0, 2.0, 3.5, 4.0, 3.0, 1.0], Country = ["France", "Spain", "France", "USA", "France", "France/USA", "Spain/USA"] )
分步骤处理:
拆分国家并计算分配后的分数
添加拆分后的国家列表列,同时将原分数按国家数量均分:transform!(db_test, :Country => (x -> split.(x, "/")) => :SplitCountries, [:SplitCountries, :Score] => ((cs, s) -> s ./ length.(cs)) => :SplitScore )展开拆分后的国家为单独行
将每个国家数组展开成独立行,每行对应一个单个国家:explode!(db_test, :SplitCountries)按单个国家分组求和
对拆分后的国家分组,求和分配后的分数:result = combine(groupby(db_test, :SplitCountries), :SplitScore => sum => :Score_sum) rename!(result, :SplitCountries => :Country)
简化链式写法
如果你喜欢更紧凑的代码,可以用链式操作:
result = db_test |> x -> transform(x, :Country => (c -> split.(c, "/")) => :SplitCountries, [:SplitCountries, :Score] => ((cs, s) -> s ./ length.(cs)) => :SplitScore ) |> x -> explode(x, :SplitCountries) |> x -> combine(groupby(x, :SplitCountries), :SplitScore => sum => :Score_sum) |> x -> rename(x, :SplitCountries => :Country)
最终结果
运行后得到的result就是你需要的输出:
Row │ Country Score_sum │ String Float64 ─────┼──────────────────── 1 │ France 12.5 2 │ Spain 3.5 3 │ USA 5.5
内容的提问来源于stack exchange,提问作者JeanJouX
相关产品推荐
相关产品推荐

