2016-11-16 12 views
1

私のコードを素早く実行しようとしています。別の列と別の辞書に基づくpandas DataFrameの列の更新

私は異なるサイズのAとBの2つのデータフレームを持っています。私はage_dictという年齢の辞書もあります。

Aは100行、Bは200行を含んでいます。それらは両方とも、0から始まるインデックスを使用します。両方とも「名前」と「年齢」の2つの列を持ちます。

辞書キーは名前であり、値は年齢です。すべてのキーがユニークである、何の重複

{:20、「マックス」:25、「ジャック」: 'ジョンの30}はありません

は、私は、各データフレーム内の名前を検索し、それらに年齢を割り当てます辞書から。このコードは、もはや私はそれがしたいよりもかかるので、パンダは簡単にを持っている場合、私は思ったんだけど

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) 

:私は、次のコードを(私は新しいデータフレームを返すと、古いものを修正しないようにしたい)を使用してこれを達成します私の代わりにこれを行う方法は、各行をループですか?

ありがとうございました!

答えて

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

あなたのdictを持つ別のデータフレームを作成し、共通鍵に基づいて2つのデータフレームをマージすることができます

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

関連する問題