我正在对数据框进行一些操作:
df
Node Interface Speed carrier 1-May 9-May 2-Jun 21-Jun
Server1 internet1 10 ATT 20 30 50 90
Server1 wan3.0 20 Comcast NaN NaN NaN 100
Server1 wan3.0 50 Comcast 30 40 40 NaN
Server2 wan2 100 Sprint 90 70 NaN NaN
Server2 wan2 20 Sprint NaN NaN 88 70
Server2 Internet2 40 Verizon 10 60 90 70
我需要按节点和接口合并数据框组中的行,将 nan 值替换为另一行,然后选择接口速度的最大值。
预期数据框应该是这样的:
df1
Node Interface Speed carrier 1-May 9-May 2-Jun 21-Jun
Server1 internet1 10 ATT 20 30 50 90
Server1 wan3.0 50 Comcast 30 40 40 100
Server2 wan2 100 Sprint 90 70 88 70
Server2 Internet2 40 Verizon 10 60 90 70
我尝试过这个:
df2=df.groupby(['Node','Interface','carrier']),agg({'Speep': 'max'}).reset_index()
df3=df.drop('Speed', axis=1)
df4=df3.ffill().drop_duplicates()
不太有效。有没有一种简单的方法来合并行、用其他行值替换 nan 值并为“速度”单元格值选择最大速度?
你可以使用
groupby
和
fillna
的组合来实现,并对“速度”列应用
max
函数。以下是如何操作:
df1 = df.groupby(['Node', 'Interface', 'carrier']).max().reset_index()
df1 = df1.fillna(method='ffill')
这首先将数据框按“节点”、“接口”和“运营商”分组。然后它使用
fillna
的
ffill
方法用每组中的前一个值填充
NaN
值。最后,它重置索引以使数据框恢复到其原始格式。
这是完整的代码:
import pandas as pd
import numpy as np
# 创建示例数据框
df = pd.DataFrame({
'Node': ['Server1', 'Server1', 'Server1', 'Server2', 'Server2', 'Server2'],
'Interface': ['internet1', 'wan3.0', 'wan3.0', 'wan2', 'wan2', 'Internet2'],
'Speed': [10, 20, 50, 100, 20, 40],
'carrier': ['ATT', 'Comcast', 'Comcast', 'Sprint', 'Sprint', 'Verizon'],
'1-May': [20, np.nan, 30, 90, np.nan, 10],
'9-May': [30, np.nan, 40, 70, np.nan, 60],
'2-Jun': [50, np.nan, 40, np.nan, 88, 90],
'21-Jun': [90, 100, np.nan, np.nan, 70, 70]
})
# 按“节点”、“接口”和“运营商”列对数据框进行分组
# 获取每个数值列的最大值
df1 = df.groupby(['Node', 'Interface', 'carrier']).max().reset_index()
# 使用前向填充来填充 NaN 值
df1 = df1.fillna(method='ffill')
print(df1)
输出:
Node Interface carrier Speed 1-May 9-May 2-Jun 21-Jun
0 Server1 internet1 ATT 10 20.0 30.0 50.0 90.0
1 Server1 wan3.0 Comcast 50 30.0 40.0 40.0 100.0
2 Server2 Internet2 Verizon 40 10.0 60.0 90.0 70.0
3 Server2 wan2 Sprint 100 90.0 70.0 88.0 70.0
说明:
-
groupby(['Node', 'Interface', 'carrier'])
: 这会根据指定的列创建数据框的分组。 -
max()
: 这会找到每个组中每列的最大值。这会处理“速度”列并忽略其他列的NaN
。 -
reset_index()
: 这会将分组的索引转换回列,使输出成为整洁的数据框。 -
fillna(method='ffill')
: 这会使用前向填充方法填充剩余的NaN
值,该方法用每列中前一个有效值替换NaN
值。
这个代码应该可以给你你想要的结果,合并行、用其他行值替换
NaN
并选择“速度”列的最大值。