比较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完成了,但这不是有什么帮助吗?