首页 > 解决方案 > pandas DataFrame的逐行处理

问题描述

您能否帮助解决特定任务。我需要逐行处理 pandas DataFrame 列。要点是必须将“None”值转换为“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”方法,但它带来了不正确的结果,因为这样每一步都不会考虑以前执行的结果,因此一些“无”值保持不变。

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”循环的情况下实现此任务?

标签: pythonpandasdataframefor-loop

解决方案


为此目的,有一些矢量化函数会更快

df = pd.DataFrame(dict(a=[1,1,np.nan, np.nan], b=[0,1,0,np.nan]))
df.ffill()


# df
     a    b
0  1.0  0.0
1  1.0  1.0
2  NaN  0.0
3  NaN  NaN

# output
     a    b
0  1.0  0.0
1  1.0  1.0
2  1.0  0.0
3  1.0  0.0

推荐阅读