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