比较python中的List和get索引

比较python中的List和get索引,python,python-2.7,pandas,anaconda,Python,Python 2.7,Pandas,Anaconda,我有一个数据框a['name','frequency']和一个列表B'name'都很长。B是我每天得到的较小的一个。我必须检查数据帧中是否有B元素,即“name”A['name']如果存在,我必须在数据框中每次出现该“name”的频率时更新它在B中的出现频率,如果B有一些新元素,我必须在数据框A中以频率1将其作为新行添加。我必须在Python2.7中完成它。非常感谢。 A是我的mac_列表,如下所示 mac_list.iloc[0:6] Out[59]: mac_address freque

我有一个数据框
a['name','frequency']
和一个列表B'name'都很长。B是我每天得到的较小的一个。我必须检查数据帧中是否有B元素,即“name”
A['name']
如果存在,我必须在数据框中每次出现该“name”的频率时更新它在B中的出现频率,如果B有一些新元素,我必须在数据框A中以频率1将其作为新行添加。我必须在Python2.7中完成它。非常感谢。 A是我的mac_列表,如下所示

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是我的新mac列表,如下所示

['20c9d0892feb' '3480b3d51d5f' '20c9d0892feb' '249cji39fj4g']
我想要一个mac_列表的输出,比如

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,即使它在新的\u mac\u列表中显示超过1

我用这个来插入新元素

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)

但这是一种非常低效的方法,我想只需比较一次就可以了。

这是初始数据帧:

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']
new_freq = pd.Series(new_mac_list).value_counts()
我首先将mac_列表的索引设置为mac_地址:

mac_list = mac_list.set_index("mac_address")
然后计算新列表中的频率:

new_mac_list = ['20c9d0892feb', '3480b3d51d5f', '20c9d0892feb', '249cji39fj4g']
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
创建索引 如果你谈论效率,首先应该想到的是指数。 我假设mac地址是唯一的

A = A.set_index("mac_address")
并访问这些项目

A.loc[i]

B上的迭代关系不大

我尝试过这个B=mac_列表['mac_address']。isin(新的mac_列表)B=list(B)用于范围内的I(len(B)):如果B[I]==True:mac_列表['frequency']。iloc[I]+=1更新频率,但问题是频率增加了1,即使它在新的\u mac\u列表中出现超过1,我也使用它插入新元素c=new\u mac\u list.isin(mac\u list['mac\u address'])c=list(c)表示范围内的I(len(c)):如果c[I]=False:mac\u list.append(new\u mac\u list[I],1)但这是一种非常低效的方法,我想只需要比较一次就可以了。请把它放在你的问题上,然后重构它。至于现在,它是不可读的。请看一次并进行相应的指导。嘿@pacholik有什么帮助吗??hey@SimonGibbons?嘿@ayhan我怎样才能把它转换成以前的格式和索引,因为我每天都要这样做。我每天都会得到一个新的列表。你说的“带索引”是什么意思?对不起,错了,把索引作为否,和mac_address列。最后,您将mac_address作为索引。您可以尝试
mac\u list.reset\u index()
但我建议将其作为索引,因为我不认为每天设置和重置索引会非常有效。嘿@ayhan,还有一个问题,我有一个巨大的mac_ID列表,在列中有一些其他变量,我要做的是获得唯一mac_ID列表及其频率,我已经使用lopp完成了,但这不是有什么帮助吗?