2017-05-15 9 views
1

こんにちは、

私は2つのテーブル(AとB)を作成するためにdataframeを使用しています。 (1番目の列は「ID」で、1つの表に同じIDの行が複数ある可能性があります)pandas(dataframe)select data

Aに基づいて新しい表(C)を作成し、Bからいくつかの行を作成したいとします。 表のID Bはまた、その後C.

にこの行を追加で発生

マイコード:

from pandas import DataFrame 

A_ID = [1,2,3,1,2] 
A_place = [1,2,3,2,1] 

B_ID = [4,2,6] 
B_place = [2,2,3] 

A_data = {'ID':A_ID,'place':A_place} 
A_table = DataFrame(A_data) 

B_data = {'ID':B_ID,'place':B_place} 
B_table = DataFrame(B_data) 

C_table = A_table 

for n in range(len(B_table)): 
    if B_table['ID'][n] in list(A_table['ID']): 
    C_table = C_table.append(B_table[n:n+1]) 

質問:

私の質問それはforループを使用せずにそれを行うには、他の方法がありますか? 私は数百万のデータを処理し、ループの廃棄には多くの時間をかけます。

ところで、大きなデータを扱うためにパンダよりも優れたツールはありますか?

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

C_table = pd.concat([C_table, B_table[B_table['ID'].isin(A_table['ID'])]]) 

だから、まず、内側の文:IDがあるB_table

B_table[B_table['ID'].isin(A_table['ID'])] 

フィルタアウト行をあなたはそれだけで行うによりパフォーマンスになりますやっていることを見てみると

+2

'C_table = B_table [B_table ['ID']のようにフィルタリングするだけです。isin(A_table ['ID'])] ' – EdChum

+0

これは動作します!!私は私の要求を満たすために少し変更を加えます: 'C_table = A_table.append(B_table [B ID]]。isin(A_table ['ID'])))' ループ? –

+0

ああええ。ループよりも速くなければなりません。 –

答えて

0

テーブルA_tableではなく、単純に追加するだけで、一度に行を追加するのではなく、遅くなる場合があります。

+0

私は時間テストを行いました。あなたのソリューションとappendを使用するソリューションは、ほぼ同じスピードです。とにかくあなたの考えをありがとう! –

+0

私の答えがあなたの質問を解決したら、それを受け入れることを忘れないでください – EdChum

+0

もちろん!私は新しい関数concatを学びました。ありがとうございました。 –