根据第一列的最大值和第二列的对应值创建新的数据框

时间:2018-10-14 16:02:32

标签: python-3.x pandas 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分钟的三个读数。

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

检查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值的数据帧的原因,认为我可以先获取每一行的最大值,然后在主数据帧上进行查找(或仅使用客户端计数我创建的数据帧),但是我只是不知道如何实现这个想法。

任何帮助将不胜感激。

1 个答案:

答案 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来解决问题(并且更快地计算)。