Dataframe Python/NaN值

Dataframe Python/NaN值,dataframe,Dataframe,出[2]: A、B组 0 1.0 2.0 5.0 1 1.0 5.0 7.0 2 2.0 3.0 6.0 3.2.0楠楠楠 4.2.0楠楠楠 5.2.08.04.0 期望输出: 出[2]: A、B组 0 1.0 2.0 5.0 1 1.0 5.0 7.0 2 2.0 3.0 6.0 3 2.0 6.0 7.0 4 2.0 7.0 8.0 5.2.0 8.0 4.0试试: blocks = df['GROUP'].ne(df['GROUP'].shift()

出[2]: A、B组 0 1.0 2.0 5.0 1 1.0 5.0 7.0
2 2.0 3.0 6.0 3.2.0楠楠楠 4.2.0楠楠楠 5.2.08.04.0

期望输出:

出[2]: A、B组 0 1.0 2.0 5.0 1 1.0 5.0 7.0
2 2.0 3.0 6.0 3 2.0 6.0 7.0 4 2.0 7.0 8.0 5.2.0 8.0 4.0试试:

blocks = df['GROUP'].ne(df['GROUP'].shift()).cumsum()
df['END'] = df['END'].fillna(df.fillna(1).groupby(blocks)['END'].cumsum()) 
df['START'] = df['START'].fillna(df['END'].shift())

您的案例没有内置的矢量化解决方案,但您可以通过一次迭代和处理每个
NaN
部分来解决它

# initialize starting and ending values
df['START'] = df['START'].mask(df['START'].isna(), df['END'].shift())
df['END'] = df['END'].mask(df['END'].isna(), df['START'].shift(-1))

while df['END'].isna().any():
    i = df['END'].loc[df['END'].isna()].index[0] # get idx of first NaN
    k = df['END'].loc[i:].loc[~df['END'].isna()].index[0] # get idx of next valid
    if df.loc[i, 'GROUP'] != df.loc[k, 'GROUP']:
        # you did not specify what to do in case a group started or ended in NaN
        # this will replace with a temp string and later replace back to NaN
        df.loc[i:k, 'START':'END'] = 'temp'
        continue
    
    n = k - i + 1
    start = df.loc[i, 'START'] # get value
    end = df.loc[k, 'END'] # get value
    delta = (end - start) / n
    df.loc[i:k, 'START':'END'] = [
        [start + row * delta, start + (row + 1) * delta]
        for row in range(n)
    ]

df = df.replace('temp', np.nan)
输出

   GROUP  START  END
0      1    2.0  5.0
1      1    5.0  7.0
2      2    3.0  6.0
3      2    6.0  7.0
4      2    7.0  8.0
5      2    8.0  4.0

请注意,需要进行一些错误处理,以说明数据帧的第一行或最后一行是
NaN

非常感谢,这非常有意义,我得到的唯一问题是这一行:k=df['time\u stamp\u end'].loc[i:]loc[~df['time\u stamp\u end'].isna()]。索引[0],i持续获取索引0超出轴0大小的界限0@stackoverlord这就是我在答案末尾解释的问题,是该列的最后一个值
NaN
?我修复了它,这是因为最后一个值NaN。格雷西亚斯·维!联合国裂纹!鼻子要干净@你测试过安瑟夫的解决方案吗?我不知道这是一个完整的解决方案还是一个建议,但如果可行的话,那就很简单了。您需要至少对您的问题提供一些解释(不仅仅是期望的输出),最好提供一些代码,以便人们能够理解您的问题