2017-07-30 15 views
1

私はこのデータフレームを持っている:パンダのペアのグループにラベルを付けるには?

>>> df = pd.DataFrame({'A': [1, 2, 1, np.nan, 2, 2, 2], 'B': [2, 1, 2, 2.0, 1, 1, 2]}) 
>>> df 
    A B 
0 1.0 2.0 
1 2.0 1.0 
2 1.0 2.0 
3 NaN 2.0 
4 2.0 1.0 
5 2.0 1.0 
6 2.0 2.0 

私はこのような何かを得るために、3列目 "グループID" にペア(A、B)のグループを特定する必要がありますどのように

>>> df 
    A B grup id      explanation 
0 1.0 2.0  1.0 <- group (1.0, 2.0), first group 
1 2.0 1.0  2.0 <- group (2.0, 1.0), second group 
2 1.0 2.0  1.0 <- group (1.0, 2.0), first group 
3 NaN 2.0  NaN <- invalid group     
4 2.0 1.0  2.0 <- group (2.0, 1.0), second group 
5 2.0 1.0  2.0 <- group (2.0, 1.0), second group 
6 2.0 2.0  3.0 <- group (2.0, 2.0), third group 

を私はパンダでこれを効率的に行うことができますか?

1つの考え方は、結合された列(A、B)を作成し、その列の一意の値を特定し、それらをデータフレームにマップすることです。しかし、私はgroupby()アプローチがより速く(よりエレガントに)なると考えています。

>>> df.groupby(['A','B']).count() 
Empty DataFrame 
Columns: [] 
Index: [(1.0, 2.0), (2.0, 1.0), (2.0, 2.0)] 

だからこのGROUPBY()のインデックスは私が必要とするすべてのグループが一覧表示されます:

は、私はこれを試してみました。しかし、それらを数え、それを私のデータフレームに戻す方法は?

答えて

2

あなたはGroupBy.ngroup(パンダ0.20.2+)を使用することができます:-1を交換し、1を追加するための同様

print (df.groupby(['A','B']).ngroup()) 
0 0 
1 1 
2 0 
3 -1 
4 1 
5 1 
6 2 
dtype: int64 

df['grup id'] = df.groupby(['A','B']).ngroup().replace(-1,np.nan).add(1) 
print (df) 
    A B grup id 
0 1.0 2.0  1.0 
1 2.0 1.0  2.0 
2 1.0 2.0  1.0 
3 NaN 2.0  NaN 
4 2.0 1.0  2.0 
5 2.0 1.0  2.0 
6 2.0 2.0  3.0 

pandasのoldiestバージョンの

df['grup id'] = df.groupby(['A','B']).ngroup() 
df['grup id'] = np.where(df['grup id'] == -1, np.nan, df['grup id'] + 1) 
print (df) 
    A B grup id 
0 1.0 2.0  1.0 
1 2.0 1.0  2.0 
2 1.0 2.0  1.0 
3 NaN 2.0  NaN 
4 2.0 1.0  2.0 
5 2.0 1.0  2.0 
6 2.0 2.0  3.0 

を(0.20.2を怒鳴ります):

df['grup id'] = df.groupby(["A","B"]).grouper.group_info[0] 
df['grup id'] = np.where(df['grup id'] == -1, np.nan, df['grup id'] + 1) 
print (df) 
    A B grup id 
0 1.0 2.0  1.0 
1 2.0 1.0  2.0 
2 1.0 2.0  1.0 
3 NaN 2.0  NaN 
4 2.0 1.0  2.0 
5 2.0 1.0  2.0 
6 2.0 2.0  3.0 
関連する問題