我有一个通过从源(网络无线控制器)提取数据而创建的数据框。
数据框是根据我构建的字典创建的。基本上这就是我正在做的(显示结构的示例-不是实际的数据框):
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()
这有效。
我以为我可以引用主数据框,但是我不知道如何。
然后我发现了:
extract column value based on another column pandas dataframe
查询选项看起来不错,但我不知道它的值。我需要首先分别发现2.4和5 Ghz列的最大值,然后获取相应的客户端计数值。这就是为什么我首先创建仅包含2.4和5 Ghz值的数据帧的原因,认为我可以先获取每一行的最大值,然后在主数据帧上进行查找(或仅使用客户端计数我创建的数据帧),但是我只是不知道如何实现这个想法。
任何帮助将不胜感激。
答案 0 :(得分:0)
您可以通过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
来解决问题(并且更快地计算)。