создать новый фрейм данных на основе максимального значения в одном столбце и соответствующего значения во втором столбце - PullRequest
0 голосов
/ 14 октября 2018

У меня есть фрейм данных, созданный путем извлечения данных из источника (беспроводной контроллер сети).

Фрейм данных создан из словаря, который я строю.Это в основном то, что я делаю (пример для демонстрации структуры, а не фактический фрейм данных):

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 ГГц.Столбцы 3, 6, 9 - это канал, используемый в спектре 2,4 ГГц.

Обычно я беру показания с 5-минутными интервалами.Выше будет представлять три чтения с 5-минутными интервалами.

Мне нужны два новых кадра данных, два столбца каждый, построенный следующим образом:

Изучите столбцы 5 ГГц (здесь это 2,5, 8).То, которое когда-либо имеет самое высокое значение, становится столбцом 1 в новом кадре данных.Столбец 2 будет значением столбца подсчета клиентов, относящимся к столбцу 5 ГГц с наибольшим значением.Другими словами, если столбец 2 был самым высоким из столбцов 2, 5, 8, то я хочу, чтобы значение в столбце 1 было значением в новом кадре данных для второго столбца.Если значение в столбце 8 было наибольшим, то я также хочу получить значение в столбце 7. Я хочу, чтобы индекс был таким же в новых фреймах данных, как и оригинал - имя точки доступа.

Я хочу сделатьэто для всех строк в основном кадре данных.Мне нужны два новых кадра данных - поэтому я повторю эту точную процедуру для столбцов 5 ГГц и 2,4 (столбцы 3, 6, 9), также получая соответствующее наибольшее значение числа клиентов для второго столбца в новом кадре данных.

Что я пробовал:

Сначала я разбил основной фрейм данных на три: df1 имеет все столбцы подсчета клиентов, df2 имеет 5 ГГц, и 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()

Это работает.

Я думал, что смогу ссылаться на основной фрейм данных, но не знаю как.

Затем я нашел это:

извлечение значения столбца на основе другого столбца pandas dataframe

Опция запроса выглядела великолепно, но я не знаю этого значения. Мне нужно сначала узнать максимальное значение 2,4 и 5Ghz столбцы, соответственно, затем захватить соответствующее значение счетчика клиентов. Поэтому я сначала создал кадры данных, содержащие только значения 2,4 и 5 ГГц, думая, что я мог бы сначала получить максимальное значение каждой строки, а затем выполнить поискОсновной фрейм данных (или используйте только количество клиентов, которое я создал), но я просто не знаю, как реализовать эту идею.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 14 октября 2018

Вы можете получить желаемое за 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 - словари и списки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...