等于值的向前填充列-熊猫

时间:2020-03-10 23:10:23

标签: python pandas

我正在尝试向前填充df中等于特定值的特定列。使用下面的df,我想填充'Code','Val1','Val2','Val3',其中代码等于item

以下内容在此虚拟数据上正常工作,但是当我将其应用于实际数据时,它会返回错误:

ValueError: Location based indexing can only have [labels (MUST BE IN THE INDEX), slices of labels (BOTH endpoints included! Can be slices of integers if the index is integers), listlike of labels, boolean] types

仅当我在执行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

1 个答案:

答案 0 :(得分:1)

我认为这可以做您想要的...这不是很优雅,但是您知道了:

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     NaN     NaN     NaN     NaN
5   NaN     NaN     NaN     NaN     NaN
6   Z       C       C       C       item
7   NaN     NaN     NaN     NaN     NaN
8   K       T       P       X       Held
9   NaN     NaN     NaN     NaN     NaN

结果:

    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