Julia 中数据帧的多级索引?

Moh*_*aad 1 multi-index dataframe julia

我可以知道如何在 Julia 中的数据帧上应用多级索引吗?或者有没有其他方法、途径或方案来实现这一目标。

更新

示例Python代码:

import numpy as np
import pandas as pd
arrays = [np.array(["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"]),
          np.array(["one", "two", "one", "two", "one", "two", "one", "two"]), ]

df = pd.DataFrame(np.random.randn(8, 4), index=arrays)
df

Run Code Online (Sandbox Code Playgroud)

输出:->

在此输入图像描述

谢谢!!

Bog*_*ski 6

我理解你的问题,但重点是你需要使用索引做什么。

\n

工作原理如下groupby

\n
julia> using DataFrames\n\njulia> df = DataFrame(x=repeat(["bar", "baz"], inner=3), y=repeat(["one", "two"], outer=3), z=1:6)\n6\xc3\x973 DataFrame\n Row \xe2\x94\x82 x       y       z\n     \xe2\x94\x82 String  String  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 bar     one         1\n   2 \xe2\x94\x82 bar     two         2\n   3 \xe2\x94\x82 bar     one         3\n   4 \xe2\x94\x82 baz     two         4\n   5 \xe2\x94\x82 baz     one         5\n   6 \xe2\x94\x82 baz     two         6\n\njulia> groupby(df, :x) # 1-level index\nGroupedDataFrame with 2 groups based on key: x\nFirst Group (3 rows): x = "bar"\n Row \xe2\x94\x82 x       y       z\n     \xe2\x94\x82 String  String  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 bar     one         1\n   2 \xe2\x94\x82 bar     two         2\n   3 \xe2\x94\x82 bar     one         3\n\xe2\x8b\xae\nLast Group (3 rows): x = "baz"\n Row \xe2\x94\x82 x       y       z\n     \xe2\x94\x82 String  String  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 baz     two         4\n   2 \xe2\x94\x82 baz     one         5\n   3 \xe2\x94\x82 baz     two         6\n\njulia> groupby(df, :y) # 1-level index\nGroupedDataFrame with 2 groups based on key: y\nFirst Group (3 rows): y = "one"\n Row \xe2\x94\x82 x       y       z\n     \xe2\x94\x82 String  String  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 bar     one         1\n   2 \xe2\x94\x82 bar     one         3\n   3 \xe2\x94\x82 baz     one         5\n\xe2\x8b\xae\nLast Group (3 rows): y = "two"\n Row \xe2\x94\x82 x       y       z\n     \xe2\x94\x82 String  String  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 bar     two         2\n   2 \xe2\x94\x82 baz     two         4\n   3 \xe2\x94\x82 baz     two         6\n\njulia> groupby(df, [:x, :y]) # 2-level index\nGroupedDataFrame with 4 groups based on keys: x, y\nFirst Group (2 rows): x = "bar", y = "one"\n Row \xe2\x94\x82 x       y       z\n     \xe2\x94\x82 String  String  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 bar     one         1\n   2 \xe2\x94\x82 bar     one         3\n\xe2\x8b\xae\nLast Group (1 row): x = "baz", y = "one"\n Row \xe2\x94\x82 x       y       z\n     \xe2\x94\x82 String  String  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 baz     one         5\n
Run Code Online (Sandbox Code Playgroud)\n

现在是 2 级索引的索引示例:

\n
julia> gdf = groupby(df, [:x, :y]) # 2-level index\nGroupedDataFrame with 4 groups based on keys: x, y\nFirst Group (2 rows): x = "bar", y = "one"\n Row \xe2\x94\x82 x       y       z\n     \xe2\x94\x82 String  String  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 bar     one         1\n   2 \xe2\x94\x82 bar     one         3\n\xe2\x8b\xae\nLast Group (1 row): x = "baz", y = "one"\n Row \xe2\x94\x82 x       y       z\n     \xe2\x94\x82 String  String  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 baz     one         5\n\njulia> gdf[("bar", "two")]\n1\xc3\x973 SubDataFrame\n Row \xe2\x94\x82 x       y       z\n     \xe2\x94\x82 String  String  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 bar     two         2\n\njulia> gdf[("baz", "two")]\n2\xc3\x973 SubDataFrame\n Row \xe2\x94\x82 x       y       z\n     \xe2\x94\x82 String  String  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 baz     two         4\n   2 \xe2\x94\x82 baz     two         6\n
Run Code Online (Sandbox Code Playgroud)\n

现在 DataFrames.jl 和 Pandas 在索引方面存在差异。对于 Pandas,你有(请参阅此处的基准):

\n
\n

当索引唯一时,pandas 使用哈希表将键映射到值 O(1)。当索引非唯一且已排序时,pandas 使用二分搜索 O(logN),当索引是随机排序时,pandas 需要检查索引中的所有键 O(N)。

\n
\n

而对于 DataFrames.jl,无论您使用什么源列进行索引查找,其复杂度始终为 O(1)。

\n