2016-05-27 2 views
2

У меня есть dataframe A['name', 'frequency'] и список B of 'name' Оба довольно длинные. B меньше, чем я получаю ежедневно. Я должен проверить, есть ли элемент B, который является «именем», в DataFrame. A['name'], если он есть, мне нужно обновлять частоту этого «имени» в кадре данных каждый раз, когда он появляется в B, и если у B есть какой-то новый элемент, я должен добавить это как новую строку в DataFrame A с частотой 1. У меня есть сделать это в python 2.7. Спасибо А мой mac_list как этотСравнение списка и получения индексов в python

mac_list.iloc[0:6] 
Out[59]: 
mac_address frequency 
0 20c9d0892feb   2 
1 28e34789c4c2   1 
2 3480b3d51d5f   1 
3 4480ebb4e28c   1 
4 4c60de5dad72   1 
5 4ca56dab4550   1 

и B мой new_mac_list как этот

['20c9d0892feb' '3480b3d51d5f' '20c9d0892feb' '249cji39fj4g'] 

Я хочу выход для mac_list как

mac_address frequency 
0 20c9d0892feb   4 
1 28e34789c4c2   1 
2 3480b3d51d5f   2 
3 4480ebb4e28c   1 
4 4c60de5dad72   1 
5 4ca56dab4550   1 
6 249cji39fj4g   1 

Я попробовал этот

b = mac_list['mac_address'].isin(new_mac_list) 
b=list(b) 
for i in range(len(b)): 
    if b[i]==True: 
     mac_list['frequency'].iloc[i]+=1 

обновить частоту, но проблема частота увеличивается на единицу, даже если это кажется более чем 1 в new_mac_list

И я использовал это, чтобы вставить новый элемент

c = new_mac_list.isin(mac_list['mac_address']) 
c=list(c) 
    for i in range(len(c)): 
     if c[i]==False: 
      mac_list.append(new_mac_list[i],1) 

Но это очень неэффективный способ я думаю это можно сделать только путем сравнения.

+0

Я попытался это б = mac_list [ 'mac_address'].ISIN (new_mac_list) Ь = лист (б) для я в диапазоне (LEN (б)): , если б [я] == Правда:. mac_list [ 'частота'] iloc [I] + = 1 обновить частоту, но проблема частота увеличивается на единицу, даже если это кажется более чем 1 в new_mac_list И я использовал это, чтобы вставить новый элемент с = new_mac_list.isin (mac_list [ 'mac_address ']) c = список (c) для i в диапазоне (len (c)): , если c [i] == False: mac_list.append (new_mac_list [i], 1) Но это очень неэффективный способ, я думаю, это можно сделать, сравнивая только один раз –

+0

. Пожалуйста, поставьте его на свой вопрос и, пожалуйста, отредактируйте его. На данный момент это нечитаемо. – pacholik

+0

Готово. Посмотрите его один раз и руководствуйтесь соответствующим образом. –

ответ

2

Это начальная dataframe:

mac_list 

    mac_address frequency 
0 20c9d0892feb   2 
1 28e34789c4c2   1 
2 3480b3d51d5f   1 
3 4480ebb4e28c   1 
4 4c60de5dad72   1 
5 4ca56dab4550   1 

И новый список:

new_mac_list = ['20c9d0892feb', '3480b3d51d5f', '20c9d0892feb', '249cji39fj4g'] 

Я бы сначала установить индекс mac_list как mac_address:

mac_list = mac_list.set_index("mac_address") 

А потом рассчитать частоты в новом списке:

new_freq = pd.Series(new_mac_list).value_counts() 

Вы можете затем использовать метод add на серии:

res = mac_list["frequency"].add(new_freq, fill_value=0) 

20c9d0892feb 4.0 
249cji39fj4g 1.0 
28e34789c4c2 1.0 
3480b3d51d5f 2.0 
4480ebb4e28c 1.0 
4c60de5dad72 1.0 
4ca56dab4550 1.0 
dtype: float64 

Назад к исходному формату:

mac_list = pd.DataFrame(res, columns = ["frequency"]) 
print(mac_list) 

       frequency 
20c9d0892feb  4.0 
249cji39fj4g  1.0 
28e34789c4c2  1.0 
3480b3d51d5f  2.0 
4480ebb4e28c  1.0 
4c60de5dad72  1.0 
4ca56dab4550  1.0 
+0

эй @ayhan, как я могу преобразовать это в предыдущий формат с индексами, как я должен делать это на ежедневной основе. Я получаю новый список ежедневно. –

+0

Что вы подразумеваете под «с индексами»? – ayhan

+0

извините typo ошибка получения индекса как нет, и столбец mac_address назад –

0

Создать индекс

Если говорить эффективность, индекс первое, что должно прийти на ум. Я предполагаю, что адреса mac уникальны.

A = A.set_index("mac_address") 

и доступ к элементам

A.loc[i] 

итерации над В имеет второстепенное отношение