我有一个数据框A['name', 'frequency']
和一个名为'name'的列表B.两者都很长。 B比我每天都要小。我必须检查在DataFrame中是否有'name'的B元素。 A['name']
如果它存在,我必须每次在B中出现时更新数据框中'name'的频率,如果B有一些新元素,我必须将其作为DataFrame A中的新行添加频率我必须在python 2.7中完成它。谢谢
A是我的mac_list,就像这样
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中出现超过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)
但这种效率非常低,我猜这可以通过仅比较一次来完成。
答案 0 :(得分:2)
这是初始数据框:
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
答案 1 :(得分:0)
如果你谈论效率,那么首先要考虑的是指数。 我假设mac地址是唯一的。
A = A.set_index("mac_address")
并访问项目
A.loc[i]
B上的迭代具有较小的相关性