2016-06-15 6 views
0

を反復します。列で定義されます:​​最速の方法は、私は2つのデータフレームを持つ2つのパンダのデータフレーム

そしてdt2ここで私はそれらのレジストリエントリをネットワーク上のマシンに一致させます。列に定義された:Index([u'id', u'machine_id', 'registry_key_id'], dtype='object')

dt1内のすべての行を反復処理するための最速の方法で、行ごとに、row['id']dt2row['registry_key_id']に発見された回数を数えますか?今

for row in dt1: 
    row['count'] = count(dt2[dt2['registry_key_id'] == row['id']] 

我々はfor index, row in panda.iterrows():を使用しているが、それは、行の数十万人を処理することになると、それは非常に遅いです:

擬似コードはと考えることができます。私たちは、そのプロセスをかなり加速する方法を探しています。

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

アップデート1:

以下のコードを参照してください:

count = count.groupby('registry_key_id').count() 
res = hunter.registry_keys().copy(deep=True) 
res['count'] = res['id'].map(count['id']) 

を我々はlen(count) == len(res)こととcount['id']'registry_key_id'の合計数が示されている返すことを確認しています。

ただし、res['count']の値はすべてNaNです。

あなたはそれを修正する際に助けてください。

回答:ぜい肉のとYarnspinnerさんの組み合わせを使用するには、

、私は12秒に1時間からカウントしてパンダをマッピングする時間を削減することができました。ありがとう!

私はあなたが左を実行する場合 mergeあなたはその後、「ID」列に value_countsを呼び出しdupesを数えることができると思い

答えて

3

あなたは試して.MAP与えることができます。 2番目のデータフレームからの各固有IDのカウントを含むデータフレームを作成した後、最初のデータフレームのreference_idをそこにマップすることができます。

import pandas as pd 
import string 
import time 

df1=pd.DataFrame(data= {"id": ["a","b","c","d"]*5,"value":range(20)}, index = range(20)) 
df2=pd.DataFrame(data= {"id": ["a","a","a","b","b","c"]*10,"whatever" : range(60)}) 

df1_1 = df1.copy() 
df2_1 = df2.copy() 

t0 = time.clock() 
reference_df2 = df2.groupby("id").count() 
for index,row in df1.iterrows(): 
    df1.loc[index] = (index,reference_df2["whatever"][1]) 
t1 = time.clock() 
print "Simply assigning constant value from df2 with iterrows method: " + str(t1-t0) 
# print df1 

t0 = time.clock() 
new_df2 = df2_1.groupby("id").count() 
df1_1["id_count"] = df1_1["id"].map(new_df2["whatever"]) 
t1 = time.clock() 
print "map method: " + str(t1-t0) 

地図は非常に高速です。

Simply assigning constant value from df2 with iterrows method: 0.0124636374812 
map method: 0.00155283320419 
+0

map()を呼び出すまではすべてがうまくいくようです。返される 'count'は常にNaNです。 –

+0

Yarnspinner様に、私たちのコードと上記で取り上げているエラーの詳細について説明しました。レビューして助けてください。ありがとうございました! –

0

dt1.merge(dt2,left_on='id', right_on='registry_key_id', how='left')['id'].value_counts() 
+0

残念ながら、データフレームのサイズは異なります。 dt2はdt1よりもかなり大きい。したがって、マージによってデータの問題が発生します。 –

+0

あなたはlhsまたはrhsにマッチさせようとしていますか? – EdChum

0

このような機能はありますか? Yarnspinnerの答えから始め

matches = dt2[dt2.registry_key_id.isin(dt1.id)] 
count = len(matches) 
2

、私は次の2つの手順で問題を分割することができ同意: はDF2内とDF1にこの情報をマッピングするよりも、すべてのIDを数えます。

import pandas as pd 
import string 

df1=pd.DataFrame(data= {"id": ["a","b","c","d"]*5,"value":range(20)}, index = range(20)) 
df2=pd.DataFrame(data= {"id": ["a","a","a","b","b","c"]*10,"whatever" : range(60)}) 


count_dict = df2.groupby('id').count().to_dict()['whatever'] 

# If a key in df1 is not in df2, then assign a 0 count 
# This part can probably be optimised but is not the purpose of the question 

unique_df1_id = df1['id'].unique().tolist() 
for key in unique_df1_id: 
    if key not in count_dict: 
     count_dict[key] = 0 

#Here you create a new column containing the desider output 
df1.loc[:, 'id count'] = df1['id'].replace(count_dict) 
+0

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

関連する問題