基于stage='done'条件从另一DataFrame为目标DataFrame添加多列并赋值
Pandas 数据匹配与填充实现方案
原始数据
df1
import pandas as pd df1 = pd.DataFrame({ 'Instance_name': ['A', 'A', 'B', 'B', 'C', 'C'], 'counter_name': ['bytes_read', 'bytes_written', 'bytes_read', 'bytes_Written', 'bytes_read', 'bytes_Written'], 'counter_value': [0, 90, 100, 90, 100, 90] })
df2
df2 = pd.DataFrame({ 'load': [0, 0, 0, 1, 1, 1, 2, 2, 2], 'instance_name': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'], 'blks_comp': [0, 10, 10, 10, 910, 980, 910, 710, 910], 'blks_sort': [50, 50, 50, 50, 950, 950, 980, 980, 980], 'blks_dirty': [90, 90, 90, 100, 9100, 9100, 9100, 8100, 9100], 'stage': ['sort', 'sort', 'comp', 'comp', 'comp', 'done', 'comp', 'done', 'ready'] })
需求
- 筛选df2中
stage等于'done'的行 - 依据
instance_name(注意df1列名为Instance_name,需统一大小写)与df1匹配,为df1新增blks_comp、blks_sort、blks_dirty三列 - 若某
Instance_name在df2中无stage='done'的记录,新增列对应值填充为0
实现代码
# 提取df2中stage为done的行,仅保留需要的列 df2_done = df2[df2['stage'] == 'done'][['instance_name', 'blks_comp', 'blks_sort', 'blks_dirty']] # 统一列名,避免大小写导致匹配失败 df2_done.rename(columns={'instance_name': 'Instance_name'}, inplace=True) # 左连接合并两个DataFrame,缺失值填充为0 df3 = df1.merge(df2_done, on='Instance_name', how='left').fillna(0) # 将填充后的浮点型数值转为整数 df3[['blks_comp', 'blks_sort', 'blks_dirty']] = df3[['blks_comp', 'blks_sort', 'blks_dirty']].astype(int) # 输出结果 print(df3)
最终输出
Instance_name counter_name counter_value blks_comp blks_sort blks_dirty 0 A bytes_read 0 0 0 0 1 A bytes_written 90 0 0 0 2 B bytes_read 100 710 980 8100 3 B bytes_Written 90 710 980 8100 4 C bytes_read 100 980 950 9100 5 C bytes_Written 90 980 950 9100
内容的提问来源于stack exchange,提问作者user3555115
相关产品推荐
相关产品推荐

