2016-11-16 1 views
1

빠른 코드 실행을 위해 노력하고 있습니다.다른 열과 별도의 사전을 기반으로 한 판다의 DataFrame 업데이트

서로 다른 크기의 두 데이터 프레임 A와 B가 있습니다. 나이가 너무 오래된 사전도 age_dict라고합니다.

A는 100 개의 행을 포함하고 B는 200 개의 행을 포함합니다. 그들은 둘 다 "0"부터 시작하는 인덱스를 사용합니다. 둘 다 "이름"과 "연령"인 두 개의 열을 가지고 있습니다.

사전 키는 이름이고 값은 연령입니다. 모든 키에는 중복

이없는, 고유 { '존'20, '최대'25 '잭': 30}

나는 각 DataFrame의 이름을 발견하고 그들에게 나이를 할당 할 사전에서. 나는 (나는 새로운 DataFrame을 반환하고 이전 수정되지 할) 다음 코드를 사용하여이를 :

def age(df): 
    new_df = df.copy(deep=True) 
    i = 0 
    while i < len(new_df['Name']): 
     name = new_df['Name'][i] 
     age = age_dict[name] 
     new_df['Age'][i] = age 
     i += 1 
    return new_df 

new_A = age(A) 
new_B = age(B) 

가이 코드는 I가 원하는보다 오래 걸립니다를, 그래서 팬더는 쉽게이 있는지 궁금하네요 방법 대신 각 행을 통해 반복 루핑을합니까?

감사합니다.

답변

2

난 당신이 map 필요하다고 생각 :

A = pd.DataFrame({'Name':['John','Max','Joe']}) 
print (A) 
    Name 
0 John 
1 Max 
2 Joe 

d = {'John':20,'Max':25,'Jack':30} 

A1 = A.copy(deep=True) 
A1['Age'] = A.Name.map(d) 
print (A1) 
    Name Age 
0 John 20.0 
1 Max 25.0 
2 Joe NaN 

만약 필요 기능 :

d = {'John':20,'Max':25,'Jack':30} 

def age(df): 
    new_df = df.copy(deep=True) 
    new_df['Age'] = new_df.Name.map(d) 
    return new_df 

new_A = age(A) 
print (new_A) 
    Name Age 
0 John 20.0 
1 Max 25.0 
2 Joe NaN 

타이밍 :

In [191]: %timeit (age(A)) 
10 loops, best of 3: 21.8 ms per loop 

In [192]: %timeit (jul(A)) 
10 loops, best of 3: 47.6 ms per loop 

코드 타이밍에 대한 :

A = pd.DataFrame({'Name':['John','Max','Joe']}) 
#[300000 rows x 2 columns] 
A = pd.concat([A]*100000).reset_index(drop=True) 
print (A) 

d = {'John':20,'Max':25,'Jack':30} 

def age(df): 
    new_df = df.copy(deep=True) 
    new_df['Age'] = new_df.Name.map(d) 
    return new_df 

def jul(A): 
    df = pd.DataFrame({'Name': list(d.keys()), 'Age': list(d.values())}) 
    A1 = pd.merge(A, df, how='left') 
    return A1 

A = pd.DataFrame({'Name':['John','Max','Joe']}) 
#[300 rows x 2 columns] 
A = pd.concat([A]*100).reset_index(drop=True) 


In [194]: %timeit (age(A)) 
The slowest run took 5.22 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 742 µs per loop 

In [195]: %timeit (jul(A)) 
The slowest run took 4.51 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 1.87 ms per loop 
+0

놀라운 감사합니다. 그 코드가 즉시 작동합니다 – Asim

1

당신은 당신의 딕셔너리와 다른 dataframe을 만들고 공통의 키를 기반으로 두 dataframes을 병합 할 수 있습니다 :

d = {'John':20,'Max':25,'Jack':30} 
A = pd.DataFrame({'Name':['John','Max','Joe']}) 

df = pd.DataFrame({'Name': d.keys(), 'Age': d.values()}) 
A1 = pd.merge(A, df, how='left') 
# Name Age 
# 0 John 20 
# 1 Max 25 
# 2 Joe NaN 
+0

예, 속도는 더 느립니다. – jezrael

+0

@ jezrael 참으로. –

+0

고마워;) 흠, samll 데이터 프레임에서 흥미 롭습니다.'map'은 큰 것처럼 더 빠릅니다. – jezrael

관련 문제