2017-04-25 7 views
0

をラッパーを追加し、私はnuniqueでの問題は、それが私がGROUPBYが空である場合という簡単なチェックを追加したいエラーオーバーライドnunique()またはそれに

>df 
Empty DataFrame 
Columns: [A, B] 
Index: [] 
>df.groupby(['A'])['B'].nunique() 
IndexError: index 0 is out of bounds for axis 0 with size 0 

で終わる空のGROUPBYによって呼び出されていちょうど空のシリーズを返します。

私はポータブルPythonでnuniqueのDEFを変更して動作しますが、チェックを追加しました:

def nunique(self, dropna=True): 
    """ Returns number of unique elements in the group """ 
    ids, _, _ = self.grouper.group_info 
    val = self.obj.get_values() 

    try: 
     sorter = np.lexsort((val, ids)) 
    except TypeError: # catches object dtypes 
     assert val.dtype == object, \ 
      'val.dtype must be object, got %s' % val.dtype 
     val, _ = algos.factorize(val, sort=False) 
     sorter = np.lexsort((val, ids)) 
     isnull = lambda a: a == -1 
    else: 
     isnull = com.isnull 

    ids, val = ids[sorter], val[sorter] 

    if ids.size == 0: ######Thats what I've added 
     return Series(ids,index=self.grouper.result_index,name=self.name) 

    # group boundaries are where group ids change 
    # unique observations are where sorted values change 
    idx = np.r_[0, 1 + np.nonzero(ids[1:] != ids[:-1])[0]] 
    inc = np.r_[1, val[1:] != val[:-1]] 

    # 1st item of each group is a new unique observation 
    mask = isnull(val) 
    if dropna: 
     inc[idx] = 1 
     inc[mask] = 0 
    else: 
     inc[mask & np.r_[False, mask[:-1]]] = 0 
     inc[idx] = 1 

    out = np.add.reduceat(inc, idx).astype('int64', copy=False) 
    res = out if ids[0] != -1 else out[1:] 
    ri = self.grouper.result_index 

    # we might have duplications among the bins 
    if len(res) != len(ri): 
     res, out = np.zeros(len(ri), dtype=out.dtype), res 
     res[ids] = out 

    return Series(res, 
        index=ri, 
        name=self.name) 

事は、私はポータブル自体を変更することはできませんで、私はnunique上書きまたはラッパー関数を追加して何とか必要がありますgroupby(...)。nunique()が呼び出されたときに呼び出されます。 私はオンラインで見ましたが、何も見つけられませんでした。申し訳ありませんが それは簡単なQかもしれないが、私は初心者プログラマだので私に簡単に行く:)

はの長さをチェックするために条件を追加して適用する機能を使用することについては何

+0

あなたのパンダバージョンは何ですか?私は、バージョン0.19.2が 'df'が空のときに' df.groupby(['A'])['B'] .nunique() 'の空の系列を返すことを確認しました。 – gereleth

+0

こんにちは、私のバージョンは0.18.1で、それはそれが後のバージョンで修正された既知の問題であることがわかりましたが、Pandasのアップデートは問題があります...おそらく私はpackage.whlをインストールすることができますどのパッケージですか?ありがとうございます –

答えて

1

、ありがとう場合グループ?

df.groupby(['A'])['B'].apply(lambda x: x.nunique() if len(x)>0 else 0) 
+0

こんにちは、まず、あなたの助けてくれてありがとう!それは素晴らしい解決策ですが、ラムダはパフォーマンスに重く、私はできるだけ多くを避けようとしています... –

+0

その場合、あなたはあなたのコードに必要な方法でヌニーク関数を再定義して、それを呼び出すことができますdf.groupby(['A'])['B']。apply(func = nunique)は動作するはずです。私はラムダ関数を使用することはおそらく、問題を解決するためのより簡単な方法だと思う。 – Allen

関連する問題