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)
输出:->
谢谢!!
我理解你的问题,但重点是你需要使用索引做什么。
\n工作原理如下groupby
:
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 级索引的索引示例:
\njulia> 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\n当索引唯一时,pandas 使用哈希表将键映射到值 O(1)。当索引非唯一且已排序时,pandas 使用二分搜索 O(logN),当索引是随机排序时,pandas 需要检查索引中的所有键 O(N)。
\n
而对于 DataFrames.jl,无论您使用什么源列进行索引查找,其复杂度始终为 O(1)。
\n 归档时间: |
|
查看次数: |
844 次 |
最近记录: |