pandas DataFrame 的逐行处理

您能帮忙解决一个具体任务吗?我需要逐行处理 pandas DataFrame 列。要点是“无”值必须转换为“0”或“1”,以便继续处理列中已有的“0”或“1”值。我已经通过使用“for”循环完成了它,并且它工作正常:


for i in np.arange(1, len(pd['signal'])):

    if df.isnull(df['signal'].iloc[i]) and df['signal'].iloc[i-1] == 0:

        df['signal'].iloc[i] = 0

    if df.isnull(df['signal'].iloc[i]) and df['signal'].iloc[i-1] == 1:

        df['signal'].iloc[i] = 1

但是,事实上这并不是迭代 DataFrame 的好方法。我尝试使用“loc”方法,但它带来了不正确的结果,因为这样每个步骤都不会考虑之前执行的结果,因此一些“None”值保持不变。


df.loc[(df.isnull(df['signal'])) & (df['signal'].shift(1) == 0), 'signal'] = 0 

df.loc[(df.isnull(df['signal'])) & (df['signal'].shift(1) == 1), 'signal'] = 1 

有谁知道如何在没有“for”循环的情况下实现此任务?


慕标琳琳
浏览 475回答 2
2回答

慕村225694

有专门用于此目的的矢量化函数,速度会快得多:df = pd.DataFrame(dict(a=[1,1,np.nan, np.nan], b=[0,1,0,np.nan]))df.ffill()# df     a    b0  1.0  0.01  1.0  1.02  NaN  0.03  NaN  NaN# output     a    b0  1.0  0.01  1.0  1.02  1.0  0.03  1.0  0.0

白猪掌柜的

您可以在以下位置使用 numpy:import numpy as npdf['signal'] = np.where(pd.isnull(df['signal']), df['signal'].shift(1), df['signal'])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python