2017-02-15 10 views
1

의 대응 값에 대하여 하나 개의 컬럼의 고유 값에 의해 크기 점 산점도 :팬더 : 다음 샘플 Dataframe 감안할 때 다른 열

df = pd.DataFrame({ 'A' : [ 1, 1, 1, 2, 2, 2, 3, 3, 3 ], 
        'B' : [ 'x', 'y', 'z', 'x', 'y', 'y', 'x', 'x', 'x' ] }) 

나는 B의 고유 값들의 산점도를 생성하고자합니다 (함께

A = [ 1, 1, 1, 2, 2, 3 ] 
B = ['x', 'y', 'z', 'x', 'y', 'x'] 
Bsize = [ 1, 1, 1, 1, 2, 3] 

내가 해봤 GROUPBY와 함께이 일을 :

,536,913 나는 다음과 같은 세 가지 목록을 얻을하려는의 해당 값에 대해) 고유 값의 각 그룹 내에서 B 값의 숫자로 크기 점, 그래서 그룹의 63,210
group = df.groupby(['A','B']) 

키는 내가 원하는 데이터를 포함하지만, 그들은 주문하지 않을 :

group.group.keys() 
[(1, 2), (1, 3), (3, 1), (2, 1), (2, 2), (1, 1)] 

'첫 번째'방법은 Dataframe 모양을 반환하지만 난에 액세스 할 수 없습니다 'A'와 'B'키 : 나는 이름과 그룹을 반복하면

group.first()['A'] 
... 
KeyError: 'A' 

는 상황이 주문하는 것, 그래서 수행하여 내가 원하는 것을 얻을 수 있습니다

A = [] 
B = [] 
for name, _ in group: 
    A.append(name[0]) 
    B.append(name[1]) 
,

나는 다음을 수행하여 Bsize 목록을 얻을 수 있습니다 :

group['B'].count().values 
array([1, 1, 1, 1, 2, 3]) 

그러나, 이것은 극단적 어설픈 것 같다 내가 제대로 그룹을 사용하는 방법을 이해하지 않은 나에게 제안합니다.

답변

1

IIUC 어쩌면 할 수 있습니다 import numpy as np과 : 다음

In [52]: group = df.groupby(['A','B']).apply(np.unique).reset_index() 

In [53]: group 
Out[53]: 
    A B  0 
0 1 x [1, x] 
1 1 y [1, y] 
2 1 z [1, z] 
3 2 x [2, x] 
4 2 y [2, y] 
5 3 x [3, x] 

:

In [87]: group = df.groupby(['A','B']).size().reset_index(name='s') 

In [88]: group 
Out[88]: 
    A B s 
0 1 x 1 
1 1 y 1 
2 1 z 1 
3 2 x 1 
4 2 y 2 
5 3 x 3 

Bsize :

In [57]: A = group['A'].tolist() 

In [58]: B = group['B'].tolist() 

In [59]: A 
Out[59]: [1, 1, 1, 2, 2, 3] 

In [60]: B 
Out[60]: ['x', 'y', 'z', 'x', 'y', 'x'] 

당신은 당신이 할 수있는 한 번에 필요한 모든 목록을 얻을 수

In [91]: group['s'].tolist() 
Out[91]: [1, 1, 1, 1, 2, 3] 

A :

In [92]: group['A'].tolist() 
Out[92]: [1, 1, 1, 2, 2, 3] 

B :

In [93]: group['B'].tolist() 
Out[93]: ['x', 'y', 'z', 'x', 'y', 'x'] 

편집 : 당신이 당신의 모든 목록을 얻기 위해 마지막 하나를 유지할 수 있도록, 당신이 필요로하는 모든 정보를 가지고 마지막 dataframe에서 .

+0

size(). reset_index (name = 's')'에는 모든 정보가 들어 있으므로'np.unique'를 제거하는 것이 좋습니다. – unutbu

+0

@unutbu 네, 맞습니다! ;-) –