我通过从源(网络无线控制器)提取数据来创建数据。
Dataframe是根据我构建的字典创建的。这基本上就是我正在做的事情(一个显示结构的示例--而不是实际的数据):
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分钟一次。
我想要的是两个新的dataframes,每个列两列,构造如下:
检查5 Ghz列(这里是2,5,8)。它的最高值变成了新的dataframe中的第1列。第2列是与值最高的5 Ghz列相关的client count列的值。换句话说,如果列2是第2、5、8列中最高的,那么我希望第1列中的值是第二列的新dataframe中的值。如果第8列中的值最高,那么我也想在第7列中提取值,我希望新的数据格式中的索引与原始的- AP名称相同。
我想要对'main‘dataframe中的所有行执行此操作。我想要两个新的数据格式--所以我将对5 Ghz列和2.4列(第3、6、9列)重复这个精确的过程--也获取新数据中第二列对应的最高客户计数值。
我试过的是:
首先,我将主数据分解为三个: df1有所有的客户机计数列,df2有5 Ghz,df3有2.4info,使用如下:
# 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值的dataframe的原因,我认为首先可以得到每一行的最大值,然后对主数据帧进行查找(或者只使用我创建的客户端计数),但我不知道如何实现这个想法。
如能提供任何协助,将不胜感激。
发布于 2018-10-14 18:54:34
你可以从三个步骤得到你想要的:
# 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
,那么解决这个问题会更容易(而且计算速度更快)。
https://stackoverflow.com/questions/52804535
复制相似问题