[英]Counting unique index values in Pandas groupby
在Pandas中,有一種非常簡潔的方法可以按操作計算組內列中的不同值。 例如
ex = pd.DataFrame([[1, 2, 3], [6, 7, 8], [1, 7, 9]],
columns=["A", "B", "C"]).set_index(["A", "B"])
ex.groupby(level="A").C.nunique()
將返回
A
1 2
6 1
Name: C, dtype: int64
我還想計算索引級別B
的不同值,同時按A
進行分組。 我找不到從groupby
對象訪問B
級別的簡潔方法。 我能想到的最好的是:
ex.reset_index("B", drop=False).groupby(level="A").B.nunique()
正確返回:
A
1 2
6 1
Name: B, dtype: int64
有沒有辦法讓我在groupby上執行此操作而不重置索引或使用apply
函數?
IIUC你可以為所有級別執行reset_index
,然后groupby為'A'並應用nunique
方法:
res = ex.reset_index().groupby('A').agg(lambda x: x.nunique())
In [339]: res
Out[339]:
B C
A
1 2 2
6 1 1
與pivot_table
相同的解決方案:
In [341]: ex.reset_index().pivot_table(index='A', aggfunc=lambda x: x.nunique())
Out[341]:
B C
A
1 2 2
6 1 1
不確定這是否更好,但它不使用應用或重置索引:)
In [20]: ex.groupby(level="A").agg(lambda x: x.index.get_level_values(1).nunique())
Out[20]:
C
A
1 2
6 1
FWIW,我發現在開發一個復雜的群體時將它們分開是很有用的。 您可以查看您將使用的各個對象
In [24]: ex.groupby(level="A").get_group(1)
Out[24]:
C
A B
1 2 3
7 9
一起:
In [33]: (ex.groupby(level='A')
....: .C.agg({'a': lambda x: x.index.get_level_values(1).nunique(),
....: 'b': 'nunique'}))
Out[33]:
b a
A
1 2 2
6 1 1
為了您的娛樂,一個不那么容易閱讀的大聲解決方案,不使用reset_index
,或apply
,或agg
或匿名函數。 但是,它確實使用標准庫中的zip
和Counter
。
import pandas as pd
from collections import Counter
ex = pd.DataFrame([[1, 2, 3], [6, 7, 8], [1, 7, 9]],
columns=["A", "B", "C"]).set_index(["A", "B"])
A_val, nunique_B = zip(*[(k, len(Counter(v.index.labels[v.index.names.index('B')])))
for k, v in ex.groupby(level='A')])
pd.Series(nunique_B, index=pd.Int64Index(A_val, name='A'))
回報
A
1 2
6 1
dtype: int32
此外,為了一般性,我不假設B
處於指數的第1級。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.