我有一个dataframe A['name', 'frequency']和一个列表B 'name‘都是相当长的。B是小一点的,我每天都能得到。我必须检查DataFrame中是否存在B元素,即“名称”。A['name'],如果它在那里,我必须每次在B中更新数据中的“名称”的频率,如果B有一些新元素,我必须在dataframe A中添加一个频率为1的新行,我必须在python2.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 1B是我的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)但这是非常低效的方式,我想这可以通过比较一次。
发布于 2016-05-27 12:54:56
这是最初的数据格式:
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发布于 2016-05-27 13:04:43
创建索引
如果你谈论效率,指数是应该想到的第一件事。我想mac地址是独一无二的。
A = A.set_index("mac_address")并访问这些项目
A.loc[i]B上的迭代关系不大
https://stackoverflow.com/questions/37482313
复制相似问题