繁体   English   中英

使用 MultiIndex 索引到 Pandas DataFrame 时保持顺序?

[英]Maintaining order when indexing into Pandas DataFrame with a MultiIndex?

如果我有一个带有 MultiIndex 的 Pandas DataFrame,我怎样才能索引到 DataFrame 同时保留我索引的事物的顺序?

例如,如果我使用以下命令创建 DataFrame:

import pandas as pd

df = pd.DataFrame.from_records([
    ("alice", "us", 5),
    ("alice", "fr", 10),
    ("alice", "de", 15),
    ("bob", "us", 10),
    ("bob", "de", 20),
    ("bob", "fr", 15),
    ("charlie", "za", 20),
    ("charlie", "de", 5),
    ("charlie", "us", 10),
], columns=["name", "country", "value"])

df.set_index(["name", "country"], inplace=True)

然后df包含:

                 value
name    country
alice   us           5
        fr          10
        de          15
bob     us          10
        de          20
        fr          15
charlie za          20
        de           5
        us          10

如果我随后对其进行索引以获取name为“charlie”或“alice”且country为“de”、“us”或“za”的值,然后将结果打印为元组:

for t in df.loc[(["charlie", "alice"], ["de", "us", "za"]), :].itertuples():
    print(t)

然后我以索引的排序顺序得到结果,而不是我用来索引的列表的顺序,即:

Pandas(Index=('alice', 'us'), value=5)
Pandas(Index=('alice', 'de'), value=15)
Pandas(Index=('charlie', 'za'), value=20)
Pandas(Index=('charlie', 'de'), value=5)
Pandas(Index=('charlie', 'us'), value=10)

我怎样才能做类似的事情,但保持我索引的顺序? 例如,我希望 output 为:

Pandas(Index=('charlie', 'de'), value=5)
Pandas(Index=('charlie', 'us'), value=10)
Pandas(Index=('charlie', 'za'), value=20)
Pandas(Index=('alice', 'de'), value=15)
Pandas(Index=('alice', 'us'), value=5)

即与我在df.loc[(["charlie", "alice"], ["de", "us", "za"]), :]中使用的值的顺序相同。

您可以将reindex与使用您的两个列表制作的MultiIndex.from_product一起使用。 您需要dropna才能获取以前不存在的行。

for t in (df.reindex(pd.MultiIndex.from_product((["charlie", "alice"], 
                                                 ["de", "us", "za"])))
           .dropna().itertuples()):
    print(t)
Pandas(Index=('charlie', 'de'), value=5.0)
Pandas(Index=('charlie', 'us'), value=10.0)
Pandas(Index=('charlie', 'za'), value=20.0)
Pandas(Index=('alice', 'de'), value=15.0)
Pandas(Index=('alice', 'us'), value=5.0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM