25

100回未満し​​か発生しないエントリをデータフレームから削除しようとしています。データフレームdataは次のようになります。

pid   tag
1     23    
1     45
1     62
2     24
2     45
3     34
3     25
3     62

ここで、次のようにタグの出現回数をカウントします。

bytag = data.groupby('tag').aggregate(np.count_nonzero)

しかし、カウントが少ないエントリを削除する方法がわかりません...

4

4 に答える 4

32

0.12の新機能であるgroupbyオブジェクトにはfilterメソッドがあり、次のタイプの操作を実行できます。

In [11]: g = data.groupby('tag')

In [12]: g.filter(lambda x: len(x) > 1)  # pandas 0.13.1
Out[12]:
   pid  tag
1    1   45
2    1   62
4    2   45
7    3   62

関数(フィルターの最初の引数)が各グループ(サブフレーム)に適用され、結果には、Trueと評価されたグループに属する元のDataFrameの要素が含まれます。

注:0.12では、順序が元のDataFrameとは異なり、これは0.13以降で修正されました。

In [21]: g.filter(lambda x: len(x) > 1)  # pandas 0.12
Out[21]: 
   pid  tag
1    1   45
4    2   45
2    1   62
7    3   62
于 2013-08-21T12:51:45.967 に答える
26

編集:このはるかに直接的な方法を示してくれた@WesMcKinneyに感謝します:

data[data.groupby('tag').pid.transform(len) > 1]

import pandas
import numpy as np
data = pandas.DataFrame(
    {'pid' : [1,1,1,2,2,3,3,3],
     'tag' : [23,45,62,24,45,34,25,62],
     })

bytag = data.groupby('tag').aggregate(np.count_nonzero)
tags = bytag[bytag.pid >= 2].index
print(data[data['tag'].isin(tags)])

収量

   pid  tag
1    1   45
2    1   62
4    2   45
7    3   62
于 2012-11-19T03:17:23.713 に答える
5

ここに掲載されているいくつかのソリューションの実行時間とvalue_counts()、他のソリューションよりもはるかに高速ではなかった(を使用した)ソリューションを次に示します。

データを作成します。

import pandas as pd
import numpy as np

# Generate some 'users'
np.random.seed(42)
df = pd.DataFrame({'uid': np.random.randint(0, 500, 500)})

# Prove that some entries are 1
print "{:,} users only occur once in dataset".format(sum(df.uid.value_counts() == 1))

出力:

171 users only occur once in dataset

1つのエントリだけでユーザーを削除するいくつかの異なる方法の時間を計ります。これらは、JupyterNotebookの別々のセルで実行されました。

%%timeit
df.groupby(by='uid').filter(lambda x: len(x) > 1)

%%timeit
df[df.groupby('uid').uid.transform(len) > 1]

%%timeit
vc = df.uid.value_counts()
df[df.uid.isin(vc.index[vc.values > 1])].uid.value_counts()

これらにより、次の出力が得られました。

10 loops, best of 3: 46.2 ms per loop
10 loops, best of 3: 30.1 ms per loop
1000 loops, best of 3: 1.27 ms per loop
于 2017-05-03T01:36:16.687 に答える
2
df = pd.DataFrame([(1, 2), (1, 3), (1, 4), (2, 1),(2,2,)], columns=['col1', 'col2'])

In [36]: df
Out[36]: 
   col1  col2
0     1     2
1     1     3
2     1     4
3     2     1
4     2     2

gp = df.groupby('col1').aggregate(np.count_nonzero)

In [38]: gp
Out[38]: 
      col2
col1      
1        3
2        2

カウント>2の場所を取得しましょう

tf = gp[gp.col2 > 2].reset_index()
df[df.col1 == tf.col1]

Out[41]: 
   col1  col2
0     1     2
1     1     3
2     1     4
于 2012-11-19T02:02:21.857 に答える