Pandas按主机名分组 将多行列日期数据合并为单行结果
Pandas按主机合并多行补丁日期到单行
原始数据
import pandas as pd df = pd.DataFrame([ ['server1', 'NA', 'NA', '2011-03-31'], ['server1', '2011-02-22', 'NA', 'NA'], ['server1', 'NA', '2011-06-22', 'NA'], ['server2', 'NA', 'NA', '2011-12-31'], ['server2', 'NA', '2011-02-21', 'NA'], ['server3', 'NA', 'NA', '2011-08-29'], ], columns=['hostname', 'patch_date1', 'patch_date2', 'patch_date3'])
解决方案
原始数据中的'NA'是字符串类型,需要先转换为Pandas可识别的缺失值,再通过分组聚合提取每个主机的有效补丁日期:
- 替换字符串
'NA'为Pandas缺失值:
df = df.replace('NA', pd.NA)
- 按
hostname分组,对每个日期列提取非缺失值(每个主机的单日期列仅存在一个有效数据,first()/max()/min()均可实现):
result_df = df.groupby('hostname', as_index=False).first()
- 将缺失值转回字符串
'NA',匹配目标格式:
result_df = result_df.fillna('NA')
- 格式化输出对齐结果:
for _, row in result_df.iterrows(): print(f"{row['hostname']} | {row['patch_date1'].ljust(9)} | {row['patch_date2'].ljust(9)} | {row['patch_date3']}")
最终输出
server1 | 2011-02-22 | 2011-06-22 | 2011-03-31 server2 | NA | 2011-02-21 | 2011-12-31 server3 | NA | NA | 2011-08-29
内容的提问来源于stack exchange,提问作者Bandhala Raja Selvam
相关产品推荐
相关产品推荐

