[英]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.