如何在Pandas DataFrame中合并两列生成第三列:取有效值或均值
问题解决:Pandas生成符合规则的第三列
需求说明
我有一个包含两列的Pandas DataFrame,需要生成第三列df['col3'],规则如下:
- 若仅col1或col2存在有效值,则取该值;
- 若两列均有有效值,则取二者的均值;
- 若两列均无有效值,则保留NaN。
尝试的代码(不符合预期)
df['col3']=pd.concat([df['col2'], df['col1']]).groupby(level=0).mean()
示例数据
time col1 col2 2000-01-31 389.5400 NaN 2000-02-29 387.7700 NaN 2000-03-31 386.6600 250.2 2000-04-30 384.1850 NaN 2000-05-31 383.3600 267.2 ... ... ... 2020-03-31 396.3755 NaN 2020-04-30 NaN 350.12 2020-05-31 395.0485 NaN 2020-06-30 394.9400 396.321 2020-07-31 395.3070 NaN
正确实现方法
方法1:直接使用mean(axis=1)
Pandas的mean方法会自动忽略NaN值,完全匹配你的规则,代码简洁高效:
df['col3'] = df[['col1', 'col2']].mean(axis=1)
- 仅单列有值时,均值等于该有效值;
- 两列都有值时,计算二者的平均值;
- 两列均无有效值时,结果保留NaN。
方法2:自定义apply逻辑(适配复杂规则场景)
如果后续规则需要调整,可以用自定义函数逐行处理:
import pandas as pd def get_col3_value(row): valid_values = [val for val in [row['col1'], row['col2']] if pd.notna(val)] if not valid_values: return pd.NA elif len(valid_values) == 1: return valid_values[0] else: return sum(valid_values) / len(valid_values) df['col3'] = df.apply(get_col3_value, axis=1)
内容的提问来源于stack exchange,提问作者maximusdooku
相关产品推荐
相关产品推荐

