簡體   English   中英

計算Pandas groupby中的唯一索引值

[英]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或匿名函數。 但是,它確實使用標准庫中的zipCounter

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM