我一直无法弄清楚。
假设我有一个看起来像这样的熊猫数据框(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
答案 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'])