【问题标题】:create new dataframe based upon max value in one column and corresponding value in a second column根据一列中的最大值和第二列中的相应值创建新数据框
【发布时间】:2018-10-15 02:54:34
【问题描述】:

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

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 信息,使用如下:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    你可以通过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
    

    我想虽然不确定如果不使用 pandas 仅使用内置的 python 数据类型 - 字典和列表,解决问题会更容易(并且计算速度更快)。

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2021-10-03
    • 1970-01-01
    • 2021-06-06
    • 2022-10-04
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多