2016-12-09 6 views
2

나는 내 머리를 부러 뜨리는 질문이 있습니다. 예를 들어, 자동차에 의한팬더 그룹과 함께 운영

df2 = pd.DataFrame(np.random.randint(0,3,size=(10, 4)),columns=['ONE', 'TWO', 'CARS', 'FOUR']) 
df2['NAMES'] = ['Peter','Jon','Mary','Mary','Peter','Peter','BONIFACE','Michael','Lucy','Gilari'] 
df2['CARS'] = ['Mercedes','BMW','Ford','BMW','BMW','Dacia','Ford','Pontiac','Chevrolet','Tesla'] 

그리고 그룹을 : 나는 다음 dataframe을 가지고 있다고 가정 .

agrupe = df2.groupby(['CARS']) 

것은 내가 그것을 그룹화 일단 내가 BMW에 의해 만들어진 그룹의 예를 들어 내가 2이 요소에서 COL 4 COL 2의 값을 할당 할, 그것은 작동 할 것입니다 열 1에. 나는 그것을 운영하는 법을 배워야 경우 볼 수 있습니다 :

g = agrupe.get_group('BMW') 

그리고 이것은이

 ONE TWO CARS FOUR NAMES 
1 1 0 BMW  1 Jon 
3 2 1 BMW  1 Mary 
4 0 1 BMW  0 Peter 

에서 진행 : 것 같다

ONE TWO CARS FOUR NAMES 
1 1 0 BMW  1 Jon 
3 2 1 BMW  1 Mary 
4 0 1 BMW  1 Peter 
+0

'열 2에 2가있는 열에서 col 2의 값을 열 4에 지정하고 싶습니다. '? 'TWO' 열 또는 두번째 열 ='CARS'입니까? 게다가, 주어진 예가 ur가 말하는 것을 일치하지 않습니다 – MMF

+0

죄송합니다, 제 모국어가 영어가 아닙니다. 나는 자동차로 그룹을 만든 다음 다른 칼럼의 값을 확인하고 칼 1을 말하게한다. 2 in col 1이있는 값은 col 2의 값을 col 4로 지정합니다. 이제는 더 분명 해졌기를 바랍니다. 고맙습니다. –

+0

문제 없습니다. col2에 의해 열은 'TWO' 또는 df.columns [2]입니까? – MMF

답변

1

사용자 정의 기능 fgroupby 필요

np.random.seed(100) 
df2 = pd.DataFrame(np.random.randint(0,3,size=(10, 4)),columns=['ONE', 'TWO', 'CARS', 'FOUR']) 
df2['NAMES'] = ['Peter','Jon','Mary','Mary','Peter','Peter','BONIFACE','Michael','Lucy','Gilari'] 
df2['CARS'] = ['Mercedes','BMW','Ford','BMW','BMW','Dacia','Ford','Pontiac','Chevrolet','Tesla'] 
print (df2) 
    ONE TWO  CARS FOUR  NAMES 
0 0 0 Mercedes  2  Peter 
1 2 0  BMW  1  Jon 
2 2 2  Ford  2  Mary 
3 1 0  BMW  0  Mary 
4 0 2  BMW  1  Peter 
5 1 2  Dacia  0  Peter 
6 0 1  Ford  1 BONIFACE 
7 0 0 Pontiac  1 Michael 
8 1 2 Chevrolet  2  Lucy 
9 1 1  Tesla  2 Gilari 
df2.loc[(df2.CARS == 'BMW') & (df2.ONE == 2), 'FOUR'] = df2.TWO 
print (df2) 
    ONE TWO  CARS FOUR  NAMES 
0 0 0 Mercedes  2  Peter 
1 2 0  BMW  0  Jon 
2 2 2  Ford  2  Mary 
3 1 0  BMW  0  Mary 
4 0 2  BMW  1  Peter 
5 1 2  Dacia  0  Peter 
6 0 1  Ford  1 BONIFACE 
7 0 0 Pontiac  1 Michael 
8 1 2 Chevrolet  2  Lucy 
9 1 1  Tesla  2 Gilari 

또는 경우

2 경우 열에서 변경할 필요가 : (210)
def f(x): 
    if (x.name == 'BMW'): 
     x.loc[x.ONE == 2, 'FOUR'] = x.TWO 
    return x 

agrupe = df2.groupby('CARS').apply(f) 
print (agrupe) 
    ONE TWO  CARS FOUR  NAMES 
0 0 0 Mercedes  2  Peter 
1 2 0  BMW  0  Jon 
2 2 2  Ford  2  Mary 
3 1 0  BMW  0  Mary 
4 0 2  BMW  1  Peter 
5 1 2  Dacia  0  Peter 
6 0 1  Ford  1 BONIFACE 
7 0 0 Pontiac  1 Michael 
8 1 2 Chevrolet  2  Lucy 
9 1 1  Tesla  2 Gilari 

더 나은 솔루션은 열 CARSBMW하고 열 ONE2입니다 모든 행을 선택하고 열 TWO에 의해 FOUR을 변경 처음이다 ONE 그래서 열을 FOUR 열로 변경하십시오 TWO :

np.random.seed(13) 
df2 = pd.DataFrame(np.random.randint(0,3,size=(10, 4)),columns=['ONE', 'TWO', 'CARS', 'FOUR']) 
df2['NAMES'] = ['Peter','Jon','Mary','Mary','Peter','Peter','BONIFACE','Michael','Lucy','Gilari'] 
df2['CARS'] = ['Mercedes','BMW','Ford','BMW','BMW','Dacia','Ford','Pontiac','Chevrolet','Tesla'] 
print (df2) 
    ONE TWO  CARS FOUR  NAMES 
0 2 0 Mercedes  0  Peter 
1 2 2  BMW  1  Jon 
2 0 2  Ford  0  Mary 
3 2 2  BMW  2  Mary 
4 1 1  BMW  1  Peter 
5 0 2  Dacia  1  Peter 
6 2 1  Ford  2 BONIFACE 
7 0 0 Pontiac  0 Michael 
8 2 2 Chevrolet  0  Lucy 
9 1 1  Tesla  2 Gilari 


df2.loc[df2.ONE == 2, 'FOUR'] = df2.TWO 
print (df2) 
    ONE TWO  CARS FOUR  NAMES 
0 2 0 Mercedes  0  Peter 
1 2 2  BMW  2  Jon 
2 0 2  Ford  0  Mary 
3 2 2  BMW  2  Mary 
4 1 1  BMW  1  Peter 
5 0 2  Dacia  1  Peter 
6 2 1  Ford  1 BONIFACE 
7 0 0 Pontiac  0 Michael 
8 2 2 Chevrolet  2  Lucy 
9 1 1  Tesla  2 Gilari 
+0

확인해 보겠습니다. 감사합니다 –

+0

추가하는 경우 before np.random'np.random.seed (100)'는 내 대답과 같은 결과를 얻습니다. – jezrael

+0

그것은 옳지 않습니다.나는 자동차로 그룹화 한 다음 예를 들어 BMW로 작업했습니다. 문제는 일단 내가 그룹화했다면 각 그룹의 이름을 모른다. 그렇다면 (x.name == 'BMW') : 잘못되었다. 한번 삭제 된 부분은 기능이 제대로 작동하지 않는다는 것이다. 이 부분은 def f (x)를 사용했습니다 : x.loc [x.ONE == 2, 'FOUR'] = x.TWO return x –