我有一个通过从源(网络无线控制器)提取数据而创建的数据框。

数据框是根据我建立的字典创建的。这基本上就是我正在做的(显示结构的示例-而不是实际的数据框):

df = pd.DataFrame({'AP-1': [30, 32, 34, 31, 33, 35, 36, 38, 37],
'AP-2': [30, 32, 34, 80, 33, 35, 36, 38, 37],
'AP-3': [30, 32, 81, 31, 33, 101, 36, 38, 37],
'AP-4': [30, 32, 34, 95, 33, 35, 103, 38, 121],
'AP-5': [30, 32, 34, 31, 33, 144, 36, 38, 37],
'AP-6': [30, 32, 34, 31, 33, 35, 36, 110, 37],
'AP-7': [30, 87, 34, 31, 111, 35, 36, 38, 122],
'AP-8': [30, 32, 99, 31, 33, 35, 36, 38, 37],
'AP-9': [30, 32, 34, 31, 33, 99, 88, 38, 37]}, index=['1', '2', '3', '4', '5', '6', '7', '8', '9'])
df1 = df.transpose()

这很好。

注意有关数据。第1,2,3栏为"相关"。他们一起去。第4、5、6和7、8、9列相同。我将在稍后详细说明。

第1、4、7列是客户数。第2、5、8列是5 GHz频谱上的通道利用率。第3、6、9列是2.4 GHz频谱上的信道使用率。

基本上,我每隔5分钟阅读一次。上面的内容代表每5分钟间隔三个读数。

我想要的是两个新数据帧,每个两列,其结构如下:

检查5 Ghz列(此处为2、5、8)。值最高的将成为新数据帧中的列1。第2列将是与具有最高值的5 Ghz列相关的客户计数列的值。换句话说,如果第2列是第2、5、8列中最高的列,那么我希望第1列中的值成为第二列的新数据帧中的值。如果第8列中的值最高,那么我也要拉出第7列中的值。我希望新数据帧中的索引与原始AP名称相同。

我想对"主要"数据框中的所有行执行此操作。我想要两个新的数据框-所以我将对5 Ghz列和2.4(第3、6、9列-重复同样的步骤),同时也为新数据框中的第二列获取相应的最高客户端计数值。

我试过的

首先,我将主数据帧分为三部分:df1具有所有客户端计数列,df2具有5 Ghz,df3具有2.4 info,使用以下方法:

# create client count only dataframe
df_cc = df[df.columns[::3]]
print(df_cc)
print()
# create 5Ghz channel utilization only dataframe
df_5Ghz = df[df.columns[1::3]]
print(df_5Ghz)
print()
# create 2.4Ghz channel utilization only dataframe
df_24Ghz = df[df.columns[2::3]]
print(df_24Ghz)
print()

这可行。

我以为可以参考主数据框,但是我不知道如何。

然后我发现了这一点:

根据另一个列熊猫数据框提取列值

查询选项看起来不错,但是我不知道这个值。我需要首先分别发现2.4和5 Ghz列的最大值,然后获取相应的客户端计数值。这就是为什么我首先创建仅包含2.4和5 Ghz值的数据帧的原因,认为我可以先获取每一行的最大值,然后对主数据帧进行查找(或仅使用客户端计数我创建的数据帧),但是我只是不知道如何实现这个想法。

任何帮助将不胜感激。

您可以通过3个步骤获得想要的东西:

# connection between columns
mapping = {'2': '1', '5': '4', '8': '7'}
# 1. column with highest value among 5GHz values (pandas series)
df2 = df1.loc[:, ['2', '5', '8']].idxmax(axis=1)
df2.name = 'highest value'
# 2. column with client count corresponding to the highest value (pandas series)
df3 = df2.apply(lambda x: mapping[x])
df3.name = 'client count'
# 3. build result using 2 lists of columns (pandas dataframe)
df4 = pd.DataFrame(
{df.name: [
df1.loc[idx, col]
for idx, col in zip(df.index, df.values)]
for df in [df2, df3]},
index=df1.index)
print(df4)
输出:
highest value  client count
AP-1             38            36
AP-2             38            36
AP-3             38            36
AP-4             38           103
AP-5             38            36
AP-6            110            36
AP-7            111            31
AP-8             38            36
AP-9             38            88

我想虽然不确定不能只使用内置的python数据类型-字典和列表,而没有pandas来解决问题(更容易计算)会更容易。