pandas - python - использование столбцов для добавления значения в новый столбец - PullRequest
0 голосов
/ 10 марта 2019

Я не смог понять это. Допустим, у меня есть датафрейм панд (port_info), который выглядит следующим образом:

         chass  olt  port   BW
0        1      1     1      80000
1        1      1     2     212000
2        1      1     3     926600
3        1      1     4      50000
4        1      1     5     170000
5        1      1     6     840000
6        1      1     7     320000
7        1      1     8     500000
8        1      1     9     270000
9        1      1    10     100000
10       1      2     1     420000
11       1      2     2      60000
12       1      2     3     480000
13       1      2     4      90000
14       1      2     5          0
15       1      2     6     520000
16       1      2     7     840000
17       1      2     8     900000
18       1      2     9     110000
19       1      2    10          0

Я хочу добавить столбец в зависимости от того, сколько портов на olt на шасси. Если на один канал приходится более 8 портов, добавьте значение 1 к каждой строке для этого olt для этого блока. В противном случае добавьте значение 10 в каждую строку для этого olt для этого chass.

В конце мне нужен новый столбец (port_info.BW_cap), который имеет значение для каждого порта в зависимости от того, сколько портов есть в этом olt в этом шассе.

Пока у меня есть это, чтобы проверить максимальный порт на olt:

test = pd.DataFrame(table.groupby(['chass','olt'])['port'].max()).reset_index()

Это дает мне минималистский фрейм данных, который выглядит следующим образом:

chass  olt
1      1      10
       2      10
       3      10
       4      10
       5      10
       6      10
       7      10
       8      10
       11     10
       12     10
       13     10
       14     10
       15     10
       16     10
       17     10
       18     10

Каков наилучший способ взять все вышеперечисленное и, в основном, заставить панд перебирать каждую строку в исходном кадре данных и сравнивать с соответствующей строкой в ​​минималистском кадре данных, чтобы проверить, какой максимальный порт для этого olt для этого шасси, и добавить значение в строку в исходном фрейме данных в новом столбце с именем 'BW_cap' в зависимости от значения в минималистском фрейме данных для этой же комбинации chass / olt?

Итак, в конце концов, что-то похожее на это:

       chass  olt  port       BW    BW_cap
0        1    1     1    80000        1
1        1    1     2   212000        1
2        1    1     3   926600        1
3        1    1     4    50000        1
4        1    1     5   170000        1

1 Ответ

1 голос
/ 11 марта 2019

Я думаю, я получаю то, что вы хотите. Вам просто нужно три нижних строки в этом коде. Вы были близки, вы можете просто присоединить ваш максимальный результат в группе к исходному фрейму данных.

Стоит отметить, что «если в комбинации chass / olt более 8 портов» отличается от «максимальный порт> 8». Если ваши порты не всегда имеют номера с возрастанием от 1 до 10. Если есть комбинации chass / olt, которые имеют 3, 6, 9 в качестве 3 портов, то это только 3 порта, но максимальное значение равно 9.

import random
random.seed(123)

df = pd.DataFrame({
        'chass':[random.randint(1, 10) for x in range(200)],
        'olt':[random.randint(1, 10) for x in range(200)],
        'port':[random.randint(1, 10) for x in range(200)],
        'BW':[random.randint(0, 1000000) for x in range(200)]})

g = df.groupby(['chass', 'olt']).apply(lambda x: 1 if x.port.max() > 8 else 10).reset_index()
g.columns = ['chass', 'olt', 'BW_cap']
df = pd.merge(df, g, on=['chass', 'olt'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...