我正在尝试向前填充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
答案 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