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

技术咨询:DataFrame行首为NaN时左移行,保留后续NaN并移除初始NaN

搞定时间序列DataFrame的移位、去NaN和去重复问题!

嘿,我明白你在时间序列场景里遇到的这些关联问题了,咱们一步步来解决:

1. 核心需求:行首为NaN时向左移位,保留后续原有NaN

首先处理你最头疼的行移位问题——要实现“行首是NaN就左移,同时保留后面原有的NaN位置”,咱们可以写个自定义函数,对每行单独处理:

import pandas as pd
import numpy as np

def shift_row_preserve_nan(row):
    # 找到该行第一个非NaN元素的位置
    first_non_nan_idx = next((i for i, val in enumerate(row) if not pd.isna(val)), None)
    # 如果整行都是NaN,或者第一个元素已经非NaN,直接返回原行
    if first_non_nan_idx is None or first_non_nan_idx == 0:
        return row
    # 把从第一个非NaN开始的元素移到行首,后面补NaN
    shifted_vals = row.iloc[first_non_nan_idx:].tolist() + [np.nan] * first_non_nan_idx
    return pd.Series(shifted_vals, index=row.index)

# 应用到你的DataFrame上
df_shifted = df.apply(shift_row_preserve_nan, axis=1)

举个例子,假设原行是 [NaN, 15, NaN, 30, NaN],处理后会变成 [15, NaN, 30, NaN, NaN]——完美保留了原有的NaN相对位置,只把开头的NaN替换成后面的非NaN元素,末尾补NaN。

2. 移除DataFrame中的NaN值

移位之后,可能会剩下一些全为NaN的行,咱们把这些行删掉就行:

# 移除全为NaN的行
df_clean = df_shifted.dropna(how='all')

# 如果需要移除任何包含NaN的行(不推荐,因为你要保留部分NaN),可以用:
# df_clean = df_shifted.dropna(how='any')

3. 移除多索引重复项

如果你的DataFrame是多索引结构,要去掉重复的索引项,可以这么做:

# 保留第一个出现的索引,删除后续重复的
df_no_duplicates = df_clean[~df_clean.index.duplicated(keep='first')]

# 如果是列的多索引要去重,就改成:
# df_no_duplicates = df_clean.loc[:, ~df_clean.columns.duplicated(keep='first')]

这样一套操作下来,就能完全满足你的需求啦!

内容的提问来源于stack exchange,提问作者max steel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:47:49