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