简体   繁体   English

pandas中的groupby()和索引值

[英]groupby() and index values in pandas

I have a pandas.DataFrame with a Multiindex , thus: 我有一个pandas.DataFrameMultiindex ,因此:

a         val
   dog    1
   cat    2
b         
   fox    3
   rat    4

And I want a series whose entries are the lists of the index values at level 1, 我想要一个系列,其条目是1级索引值的列表,

so: 所以:

a    [dog, cat]
b    [fox, rat]

the following does work, but is quite slow and inelegant: 以下确实有效,但速度很慢且不够优雅:

fff = df.groupby(level=0)['val'].agg(lambda x:[i[1] for i in list(x.index.values)])

So I am hoping there is a better way. 所以我希望有更好的方法。

reset_index and groupby reset_indexgroupby

df.reset_index(level=1).groupby(level=0)['level_1'].apply(list)


Out[21]: 
a    [dog, cat]
b    [fox, rat]
Name: level_1, dtype: object

To get another of order of magnitude speed up over Wen's Answer , we can use native iterators like: 为了获得比Wen的答案更快的另一个数量级,我们可以使用本机迭代器,如:

Code: 码:

index_as_dict = {}
for k, v in index.ravel():
    index_as_dict.setdefault(k, []).append(v)
pd.Series(index_as_dict)

Test Code: 测试代码:

import pandas as pd

df = pd.read_fwf(StringIO(u"""
    level_0  level_1     val
    a        dog         1
    a        cat         2
    b        fox         3
    b        rat         4"""), header=1).set_index(['level_0', 'level_1'])
print(df)

def method1():
    return df.reset_index(level=1).groupby(level=0)['level_1'].apply(list)

def method2():
    index_as_dict = {}
    for k, v in df.index.ravel():
        index_as_dict.setdefault(k, []).append(v)
    return pd.Series(index_as_dict)

print(method1())
print(method2())

from timeit import timeit
print(timeit(method1, number=50))
print(timeit(method2, number=50))

Results: 结果:

                 val
level_0 level_1     
a       dog        1
        cat        2
b       fox        3
        rat        4
level_0
a    [dog, cat]
b    [fox, rat]
Name: level_1, dtype: object
a    [dog, cat]
b    [fox, rat]
dtype: object

0.0760027870983045
0.006749932432252637

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

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