Python 正向填充列,其中等于值-1

Python 正向填充列,其中等于值-1,python,pandas,Python,Pandas,我尝试在df中向前填充特定列,其中a等于特定值。使用下面的df,我想填写'code','Val1','Val2','Val3',其中code等于项 以下操作在这个虚拟数据上运行良好,但当我应用到实际数据时,它返回一个错误: ValueError:基于位置的索引只能有[标签(必须在索引中)、标签片(包括两个端点!如果索引为整数,则可以是整数片)、标签列表式、布尔]类型 仅当我在执行update函数之前删除空值时,该函数才对我的数据集起作用。然而,这是毫无意义的,因为df不会被填充 import p

我尝试在df中向前填充特定列,其中a等于特定值。使用下面的df,我想填写
'code','Val1','Val2','Val3'
,其中code等于

以下操作在这个虚拟数据上运行良好,但当我应用到实际数据时,它返回一个错误:

ValueError:基于位置的索引只能有[标签(必须在索引中)、标签片(包括两个端点!如果索引为整数,则可以是整数片)、标签列表式、布尔]类型

仅当我在执行
update
函数之前删除空值时,该函数才对我的数据集起作用。然而,这是毫无意义的,因为df不会被填充

import pandas as pd
import numpy as np

df = pd.DataFrame({   
        'X' : ['X',np.nan,np.nan,'Y',np.nan,'Z',np.nan,np.nan,np.nan], 
        'Val1' : ['B',np.nan,np.nan,'A',np.nan,'C',np.nan,np.nan,np.nan],            
        'Val2' : ['B',np.nan,np.nan,'A',np.nan,'C',np.nan,np.nan,np.nan],   
        'Val3' : ['A',np.nan,np.nan,'C',np.nan,'C',np.nan,np.nan,np.nan],                 
        'Code' : ['No',np.nan,np.nan,'item',np.nan,'Held',np.nan,np.nan,np.nan],                  
        })

# This function works for this dummy df
df.update(df.loc[df['Code'].str.contains('item').ffill(), ['Code','Val1','Val2','Val3']].ffill())
预期产出:

   Col FULLNAME PERSON_ID STATISTIC_CODE  Helper
0    X        B         B              A      No
1  NaN      NaN       NaN            NaN     NaN
2  NaN      NaN       NaN            NaN     NaN
3    Y        A         A              C  Assign
4  NaN        A         A              C     NaN
5    Z        C         C              C    Held
6  NaN      NaN       NaN            NaN     NaN
7  NaN      NaN       NaN            NaN     NaN
8  NaN      NaN       NaN            NaN     NaN

我想这可以做你想做的。。。它不是很优雅,但是,你会想到:

cols = ['Val1', 'Val2', 'Val3', 'Code']
len_df = len(df)

indexes = [i for i, x in enumerate(df['Code'].str.contains('item')) if x is True]

for i in indexes:
    item_row = df.loc[i, cols]

    j = i+1
    current_code = df.loc[j, 'Code']

    while current_code is np.nan:
        df.loc[j, cols] = item_row
        j += 1
        if j < len_df:
            current_code = df.loc[j, 'Code']
        else:
            break
结果:

    X    Val1   Val2    Val3    Code
0   X    B      B       A       No
1   NaN  NaN    NaN     NaN     NaN
2   NaN  NaN    NaN     NaN     NaN
3   Y    A      A       C       item
4   NaN  A      A       C       item
5   NaN  A      A       C       item
6   Z    C      C       C       item
7   NaN  C      C       C       item
8   K    T      P       X       Held
9   NaN  NaN    NaN     NaN     NaN

您能添加您期望的最终数据帧吗?对于第一列=>['X','X','X','Y','Y','Z','Z','Z','Z','Z','Z','Z','Z','Z',是否会有类似的东西?@afonsoschulzalbrechts@Caio Lopes补充道。我有点担心性能。我的数据集相当大。执行这个代码需要几个小时我也很担心。但是,由于您对正向填充的要求非常明确,因此我现在无法以更简单、更快的方式进行思考。但并行地将数据帧划分为块可能是可行的。我改变了一些事情,使它更快
    X    Val1   Val2    Val3    Code
0   X    B      B       A       No
1   NaN  NaN    NaN     NaN     NaN
2   NaN  NaN    NaN     NaN     NaN
3   Y    A      A       C       item
4   NaN  A      A       C       item
5   NaN  A      A       C       item
6   Z    C      C       C       item
7   NaN  C      C       C       item
8   K    T      P       X       Held
9   NaN  NaN    NaN     NaN     NaN