按第一列中的值对数据进行分组
Grouping data by value in first column
我正在尝试根据第一列的值对 2 列对象中的数据进行分组。我需要将这些数据放在列表中,以便之后对它们进行排序。我正在大量机器上使用 snmp 获取接口数据。在示例中,我有 2 个接口。我需要按接口分组的数据,最好是在列表中。
我得到的数据在对象项中:
for i in item:
print i.oid, i.val
ifDescr lo
ifDescr eth0
ifAdminStatus 1
ifAdminStatus 1
ifOperStatus 1
ifOperStatus 0
我想在列表中按第一列的值对这些数据进行排序,如下所示:
我想在列表中获取这些数据,所以它看起来像这样:
列表=[[lo,1,1],[eth0,1,0]]
我的解决方案又脏又长,我很尴尬 post 在这里,所以任何帮助表示赞赏。
这是我的解决方案,这样您就可以更好地理解我在说什么。我所做的是基于 item.oid 将每个接口数据放在单独的列表中,然后遍历 cpu 列表并将其与基于 item.iid 的内存和名称进行比较。最后,我将所有数据都放在 cpu 列表中,其中每个接口都是列表的一个元素。该解决方案有效,但对我的需求来说太慢了。
cpu=[]
memory=[]
name=[]
for item in process:
if item.oid=='ifDescr':
cpu.append([item.iid, int(item.val)])
if item.oid=='ifAdminStatus':
memory.append([item.iid, int(item.val)])
if item.oid=='ifOperStatus':
name.append([item.iid, item.val])
for c in cpu:
for m in memory:
if m[0]==c[0]:
c.append(m[1])
for n in name:
if n[0]==c[0]:
c.append(n[1])
cpu=sorted(cpu,key=itemgetter(1),reverse=True) #sorting is easy
是否有一种 pythonic 的、简短且更快的方法来做到这一点?限制因素是我在具有 key=data 值的 2 列对象中获取数据。
不确定我是否按照您的排序,因为我没有看到任何顺序,但要分组,您可以通过 oid
使用字典分组,使用 defaultdict 作为重复键:
data = """ifDescr lo
ifDescr eth0
ifAdminStatus 1
ifAdminStatus 1
ifOperStatus 1
ifOperStatus 0"""
from collections import defaultdict
d = defaultdict(list)
for line in data.splitlines():
a, b = line.split()
d[a].append(b)
print((d.items()))
[('ifOperStatus', ['1', '0']), ('ifAdminStatus', ['1', '1']), ('ifDescr', ['lo', 'eth0'])]
使用您的代码只需使用属性:
for i in item:
d[i.oid].append(i.val)
Pandas 是处理数据的好方法。这是一个快速示例代码。查看官方网站了解更多信息。
# Python script using Pandas and Numpy
from pandas import DataFrame
from numpy import random
# Data with the dictionary keys defining the columns
data_dictionary = {'a': random.random(5),
'b': random.random(5)}
# Make a data frame
data_frame = DataFrame(data_dictionary)
print(data_frame)
# Return an new data frame with a sorted first column
data_frame_sorted = data_frame.sort_index(by='a')
print(data_frame_sorted)
如果您安装了 numpy pandas,这应该 运行。如果您对安装 pandas 没有任何线索,请获取 "anaconda python distribution."
我正在尝试根据第一列的值对 2 列对象中的数据进行分组。我需要将这些数据放在列表中,以便之后对它们进行排序。我正在大量机器上使用 snmp 获取接口数据。在示例中,我有 2 个接口。我需要按接口分组的数据,最好是在列表中。
我得到的数据在对象项中:
for i in item:
print i.oid, i.val
ifDescr lo
ifDescr eth0
ifAdminStatus 1
ifAdminStatus 1
ifOperStatus 1
ifOperStatus 0
我想在列表中按第一列的值对这些数据进行排序,如下所示:
我想在列表中获取这些数据,所以它看起来像这样:
列表=[[lo,1,1],[eth0,1,0]]
我的解决方案又脏又长,我很尴尬 post 在这里,所以任何帮助表示赞赏。
这是我的解决方案,这样您就可以更好地理解我在说什么。我所做的是基于 item.oid 将每个接口数据放在单独的列表中,然后遍历 cpu 列表并将其与基于 item.iid 的内存和名称进行比较。最后,我将所有数据都放在 cpu 列表中,其中每个接口都是列表的一个元素。该解决方案有效,但对我的需求来说太慢了。
cpu=[]
memory=[]
name=[]
for item in process:
if item.oid=='ifDescr':
cpu.append([item.iid, int(item.val)])
if item.oid=='ifAdminStatus':
memory.append([item.iid, int(item.val)])
if item.oid=='ifOperStatus':
name.append([item.iid, item.val])
for c in cpu:
for m in memory:
if m[0]==c[0]:
c.append(m[1])
for n in name:
if n[0]==c[0]:
c.append(n[1])
cpu=sorted(cpu,key=itemgetter(1),reverse=True) #sorting is easy
是否有一种 pythonic 的、简短且更快的方法来做到这一点?限制因素是我在具有 key=data 值的 2 列对象中获取数据。
不确定我是否按照您的排序,因为我没有看到任何顺序,但要分组,您可以通过 oid
使用字典分组,使用 defaultdict 作为重复键:
data = """ifDescr lo
ifDescr eth0
ifAdminStatus 1
ifAdminStatus 1
ifOperStatus 1
ifOperStatus 0"""
from collections import defaultdict
d = defaultdict(list)
for line in data.splitlines():
a, b = line.split()
d[a].append(b)
print((d.items()))
[('ifOperStatus', ['1', '0']), ('ifAdminStatus', ['1', '1']), ('ifDescr', ['lo', 'eth0'])]
使用您的代码只需使用属性:
for i in item:
d[i.oid].append(i.val)
Pandas 是处理数据的好方法。这是一个快速示例代码。查看官方网站了解更多信息。
# Python script using Pandas and Numpy
from pandas import DataFrame
from numpy import random
# Data with the dictionary keys defining the columns
data_dictionary = {'a': random.random(5),
'b': random.random(5)}
# Make a data frame
data_frame = DataFrame(data_dictionary)
print(data_frame)
# Return an new data frame with a sorted first column
data_frame_sorted = data_frame.sort_index(by='a')
print(data_frame_sorted)
如果您安装了 numpy pandas,这应该 运行。如果您对安装 pandas 没有任何线索,请获取 "anaconda python distribution."