pandas-python-使用列为新列添加值

pandas-python-使用列为新列添加值,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我还没弄明白。 假设我有一个熊猫数据帧端口信息,如下所示: 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

我还没弄明白。 假设我有一个熊猫数据帧端口信息,如下所示:

         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
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
       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
我想根据每个机箱每个olt的端口数添加一列。 如果每个CHAS的每个olt有超过8个端口,则为该CHAS的该olt的每行添加值1。 否则,为该CHAS的olt的每行添加值10

最后,我需要一个新的列port_info.BW_cap,该列的每个端口都有一个值,该值取决于该chass中olt中有多少端口

到目前为止,我要检查每个olt的最大端口数:

test = pd.DataFrame(table.groupby(['chass','olt'])['port'].max()).reset_index()
这为我提供了一个最简单的数据框架,如下所示:

         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
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
       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
采取上述所有措施的最佳方式是什么,基本上让pandas迭代初始数据帧中的每一行,并与极简数据帧中的相应行进行比较,以检查该机箱olt的最大端口是什么,并根据同一chass/olt组合的最低数据帧中的值,在名为“BW_cap”的新列下向初始数据帧中的行添加一个值

所以最后,看起来是这样的:

         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
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
       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结果加入原始数据帧

需要注意的一点是,如果每个chass/olt组合有8个以上的端口,则表示最大端口数大于8。如果您的端口并非总是从1到10递增。如果有3、6、9作为3个端口的chass/olt组合,则只有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'])

你们的问题对我来说并不清楚,例如,当我做table.groupby['chass','olt']['port'].max.reset_索引时,我只得到两行。这是正确的,因为你有一个chass是1,两个olt是1和2。这不是很清楚的定义,你能演示一下你到底想用这个BW_cap实现什么吗?看起来是这样的。非常感谢。我会尝试一下,一旦我能正确地测试这个,我会标记你的答案。是的,关于计数和最大值,你的权利。我需要的是最大值。我们不能总是说明有多少港口。但是按照这里的操作方式,我们通常可以依赖于使用的最大端口数。好的,如果需要查看端口数,可以使用.nunique而不是max