繁体   English   中英

熊猫-python-使用列将值添加到新列

[英]pandas - python - using columns to add value to new column

我还没弄清楚。 假设我有一个熊猫数据port_infoport_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

采取以上所有措施并让熊猫基本上遍历初始数据帧中的每一行,然后与极简数据帧中的相应行进行比较,以检查该机箱的olt的最大端口是什么,并添加一个值,这是最好的方法到初始数据帧中名为“ 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

我想我得到你想要的。 您只需要此代码的底部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'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM