簡體   English   中英

pandas中的groupby()和索引值

[英]groupby() and index values in pandas

我有一個pandas.DataFrameMultiindex ,因此:

a         val
   dog    1
   cat    2
b         
   fox    3
   rat    4

我想要一個系列,其條目是1級索引值的列表,

所以:

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

以下確實有效,但速度很慢且不夠優雅:

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

所以我希望有更好的方法。

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

為了獲得比Wen的答案更快的另一個數量級,我們可以使用本機迭代器,如:

碼:

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

測試代碼:

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))

結果:

                 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