[英]groupby() and index values in pandas
我有一個pandas.DataFrame
的Multiindex
,因此:
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_index
和groupby
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.