多索引上的熊猫数据框 groupby

Posted

技术标签:

【中文标题】多索引上的熊猫数据框 groupby【英文标题】:pandas dataframe groupby on multiindex 【发布时间】:2018-08-01 17:23:59 【问题描述】:

我正在使用 Pandas 数据框来读取 excel 文件并对其进行一些操作。我有一个包含多行的标题,现在我想按几个列值分组。但是我无法找到解决方案。

Excel 示例:

    name                     address         contact_info   
    first_name  last_name   street  city    mobile  email
1   AAA         BBB         XXX     YYY     102020  aaa@xyz.com
2   111         222         333     444     239393  bbb@xyz.com
3   BBB         333         XXX     dddd    102020  aaa@xyz.com

我想按街道名称分组并从其他列中查找值 我试过了,但它无法找到街道,因为它是多索引。

df = pd.read_excel("test.xlsx", header=[0, 1], sheet_name="Sheet1")
print df.groupby("street", level=-1)[["first_name", "last_name", "email"]].apply(list)

【问题讨论】:

看起来你实际上并不需要第一行——那种重复的信息。如果您在没有第一行 (header=1) 或 (skiprows=1) 的情况下阅读它,您将不必处理多索引...让您的工作更轻松。 【参考方案1】:

您需要在各处提供元组列表:

cols = [
           ('name', 'first_name'), 
           ('name', 'last_name'), 
           ('contact_info', 'email')
]
df.groupby([('address', 'street')])[cols].apply(pd.Series.tolist)

# or, alternatively,
# df.groupby(df.address.street)[cols].apply(pd.Series.tolist)

(address, street)
333                            [[111, 222, bbb@xyz.com]]
XXX    [[AAA, BBB, aaa@xyz.com], [BBB, 333, aaa@xyz.c...

元组指定MultiIndex 列选择。

【讨论】:

我收到以下错误TypeError: unbound method tolist() must be called with Series instance as first argument (got DataFrame instance instead) @GaurangShah 试试.apply(lambda x: x.values.tolist()) @COLDSPEED 除了这样做之外,还有什么方法可以获取街道(第一列值)。 df.T.index.values.T.tolist() @GaurangShah 您的预期结果是什么?我不清楚……顺便说一句,如果答案有帮助,您也可以投票赞成。谢谢! @jezrael 不合理......我已经为你扭转了它。

以上是关于多索引上的熊猫数据框 groupby的主要内容,如果未能解决你的问题,请参考以下文章

多索引上的 Pandas TimeGrouper

使用多索引上的条件选择数据帧的子集

在多索引上使用切片器

多索引熊猫数据框上的值错误

有没有办法在行和列索引上合并熊猫数据框?

如何将熊猫数据框转换为多索引数据框