You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame值-nan交替模式异常的查找与修正咨询

解决方法

要修复这个交替模式问题,核心是先识别连续出现同一列非空值的异常行,再通过移除异常行并调整时间序列实现严格交替。以下是具体步骤:


1. 识别异常行

先合并两个源DataFrame并按时间排序,标记每行的有效列(非空的是A还是B),最后找出连续出现相同有效列的行——这些就是破坏交替规则的异常。

代码实现:

import pandas as pd
import numpy as np

# 源数据
df_a = pd.DataFrame({'Time': [1,3,6], 'Value A': [5,4,5]})
df_b = pd.DataFrame({'Time': [2,4,5], 'Value B': [2,2,3]})

# 合并并按时间排序
df_merged = pd.merge(df_a, df_b, on='Time', how='outer').sort_values('Time').reset_index(drop=True)

# 标记每行的有效列
df_merged['valid_col'] = df_merged.apply(
    lambda row: 'A' if pd.notna(row['Value A']) else 'B' if pd.notna(row['Value B']) else None,
    axis=1
)

# 找出连续相同有效列的异常行
anomalies = df_merged[df_merged['valid_col'] == df_merged['valid_col'].shift(1)]
print("异常行:")
print(anomalies)

运行后会输出Time=5的行,这就是导致连续两个B的异常。


2. 修正数据

移除异常行后,重新生成连续的Time序列,就能得到符合交替模式的结果:

# 删除异常行
df_fixed = df_merged.drop(anomalies.index).reset_index(drop=True)

# 重置Time为连续整数(从1开始)
df_fixed['Time'] = range(1, len(df_fixed)+1)

# 移除辅助列,得到最终结果
df_fixed = df_fixed.drop('valid_col', axis=1)
print("\n修正后的DataFrame:")
print(df_fixed)

输出结果完全符合期望:

Time  Value A  Value B
0     1      5.0      NaN
1     2      NaN      2.0
2     3      4.0      NaN
3     4      NaN      2.0
4     5      5.0      NaN

扩展场景处理

如果遇到多组连续异常(比如连续3个A),上述方法依然有效——它会自动移除所有与前一行有效列相同的行,确保最终序列严格交替。如果需要保留更多数据(比如用A的后续值替换连续的B),可以调整逻辑:在移除异常行后,将另一列剩余的未使用值依次填补到空缺位置,具体可根据需求修改。

内容的提问来源于stack exchange,提问作者Tom Meijer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:25:29