2016-06-15 2 views
0

У меня есть два кадра данных:быстрый способ для перебора двух кадров данных панда

dt1 где хранить миллионы ключа реестра записей. Определены столбцами: Index([u'count', u'id', u'is_malicious', u'key', u'name', u'value'], dtype='object')

И dt2, где я сопоставляю данные реестра с машинами в нашей сети. Определяется с колоннами: Index([u'id', u'machine_id', 'registry_key_id'], dtype='object')

Какой самый быстрый способ для перебора всех строк в dt1, и для каждой строки, подсчитать, сколько раз row['id'] находится в dt2 колонке row['registry_key_id']?

псевдокод можно рассматривать как:

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

Прямо сейчас мы используем for index, row in panda.iterrows():, но это довольно медленно, когда дело доходит до обработки сотен тысяч строк. Мы ищем способ значительно ускорить этот процесс.

Благодарим за помощь.

Update 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.

Не могли бы вы помочь в его устранении?

Ответ:

Использование комбинации Flab-х и ответы Yarnspinner, я был в состоянии сократить время подсчета и отображения панд от 1 часа до 12 секунд. Благодаря!

ответ

3

Вы могли бы дать .map попробовать. После создания фрейма данных, содержащего подсчеты каждого отдельного идентификатора из вашего второго фрейма данных, ссылочный_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

Кажется, что все работает, пока мы не назовем карту(). Возврат «count» всегда равен NaN. –

+0

Уважаемый Yarnspinner, мы включили дополнительную информацию о нашем коде и ошибке, которую мы получаем выше. Не могли бы вы рассмотреть и помочь? Спасибо! –

0

Я думаю, что если выполнить левый merge вы можете рассчитывать простофили призывающих value_counts на колонке «ид»:

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

К сожалению, размеры фреймов данных различны. dt2 значительно больше dt1. Таким образом, слияние создает проблемы с данными. –

+0

Так вы пытаетесь сопоставить lhs или rhs? – EdChum

0

Возможно, вам понравится эта работа?

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

Начиная с Yarnspinner ответа, я согласен можно разделить задачу на два этапа: подсчета всех идентификаторов в df2 и чем отображение этой информации в df1.

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

Спасибо, Flab! –

Смежные вопросы