将单索引 pandas df 转换为多索引 df,然后将具有相同索引的所有行分组到不同的行中

问题描述 投票:0回答:1

我有一个看起来像这样的 df:

import pandas as pd

# Create df
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol', 'Alice', 'Carol', 'Alice', 'Carol', 'Matt'],
                   'Address': ['123 A St', '123 B St', '123 C St', '123 A St', '123 C St', '456 X St', '123 C St', '123 M St'],
                   'State': ['AZ', 'TX', 'CA', 'AZ', 'CA', 'AZ', 'CA', 'MA'],
                   'Car': ['GMC', 'Mazda', 'Tesla', 'Honda', 'Nissan', 'Subaru', 'Mazda', 'Buick'],
                   'Miles': [1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888]})

# Display df
display(df)

目标

我希望输出是使用“名称”、“地址”和“状态”的多索引 df,如下所示:

姓名 地址 状态 汽车 英里
爱丽丝 123 圣 AZ 通用汽车 1111
本田 4444
爱丽丝 456 X 圣 AZ 斯巴鲁 6666
鲍勃 123 B 街 TX 马自达 2222
卡罗尔 123 C 街 CA 特斯拉 3333
日产 5555
马自达 7777
马特 123 M 街 别克 8888

已尝试代码

我尝试了以下代码,但它没有将具有相同多索引值的所有数据行分组:

df = df.set_index(keys=['Name', 'Address', 'State'])

感谢您提供的任何帮助。

python pandas dataframe multi-index
1个回答
0
投票

您需要对索引进行排序才能获得所需的结果,但是,您需要在

['Address', 'State', 'Name']
上建立索引,以免将两个
Alice
分组在一起,然后首先在
Name
上排序:

df.set_index(keys=['Address', 'State', 'Name']).sort_index(level=2)

输出:

                         Car  Miles
Address  State Name
123 A St AZ    Alice     GMC   1111
               Alice   Honda   4444
456 X St AZ    Alice  Subaru   6666
123 B St TX    Bob     Mazda   2222
123 C St CA    Carol   Tesla   3333
               Carol  Nissan   5555
               Carol   Mazda   7777
123 M St MA    Matt    Buick   8888
© www.soinside.com 2019 - 2024. All rights reserved.