熊猫-python-使用列为新列添加价值

时间:2019-03-10 20:21:38

标签: python pandas numpy dataframe

我一直无法弄清楚。 假设我有一个看起来像这样的熊猫数据框(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有多少个端口。 如果每个机架每个olt有8个以上的端口,则为该机架的每个olt每行添加一个值1。 否则,请为该跟踪记录的每行添加10值。

最后,我需要一个新列(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

采用上述所有方法并让熊猫基本上遍历初始数据帧中的每一行,然后与极简数据帧中的相应行进行比较,以检查该机箱的最大端口是什么,这是什么?在初始数据框中的新列“ BW_cap”下添加一个值,具体取决于该同一个Chas / 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 个答案:

答案 0 :(得分:1)

我想我得到了你想要的。您只需要此代码的底部3行。距离您很近,您可以将groupby max结果加入原始数据框。

需要注意的一件事是,“每个通道/ olt组合的端口数是否超过8个”与“最大端口数> 8”不同。如果您的端口并不总是以1到10的顺序递增,则如果有Chas / 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'])