Python 在pandas中的某一行之前设置行,而不进行迭代
我在pandas数据帧中有一列,我想将“大”之前的任何不间断的“正常”序列更改为“大”。我不想将列中“正常”的所有实例替换为“大”。例如,我想将左列更改为下面的右列: 输入 结果 小的 小的 小的 小的 正常 大型 正常 大型 大的 大的 小的 小的 正常 正常 小的 小的 正常 大型 大的 大的Python 在pandas中的某一行之前设置行,而不进行迭代,python,pandas,dataframe,vectorization,Python,Pandas,Dataframe,Vectorization,我在pandas数据帧中有一列,我想将“大”之前的任何不间断的“正常”序列更改为“大”。我不想将列中“正常”的所有实例替换为“大”。例如,我想将左列更改为下面的右列: 输入 结果 小的 小的 小的 小的 正常 大型 正常 大型 大的 大的 小的 小的 正常 正常 小的 小的 正常 大型 大的 大的 这里有一种使用bfill的方法 样本输出: >>> input_frame = input_frame.replace({'normal': None}) >>>
这里有一种使用bfill的方法 样本输出:
>>> input_frame = input_frame.replace({'normal': None})
>>> input_frame['bfilled'] = input_frame[0].bfill()
>>> input_frame
0 bfilled
0 small small
1 small small
2 None large
3 None large
4 large large
5 small small
6 None small <--- This should be changed
7 small small
8 None large
9 large large
>>> # Select the row(s) that need to be changed with
>>> input_frame.loc[(input_frame['bfilled'] != 'large') & input_frame[0].isna()]
0 bfilled
6 None small
>>input\u frame=input\u frame.replace({'normal':None})
>>>输入帧['bfilled']=输入帧[0]。bfill()
>>>输入帧
0 bfilled
0小
1小
2无大
3无大
4大号
5小
6非小>>#选择需要更改的行
>>>input_frame.loc[(input_frame['bfilled']!='large')&input_frame[0].isna()]
0 bfilled
6不小
尝试使用b填充和where
:
df1.loc[df1['input'].eq("normal")] = np.nan
df1['result'] = df1.fillna(method='bfill').where(df1.notnull() | (df1.shift(-1) != 'small')).fillna('normal')
df1:
input result
0 small small
1 small small
2 NaN large
3 NaN large
4 large large
5 small small
6 NaN normal
7 small small
8 NaN large
9 large large
避免使用itterrows
。太慢了。
input result
0 small small
1 small small
2 NaN large
3 NaN large
4 large large
5 small small
6 NaN normal
7 small small
8 NaN large
9 large large