请帮助您解决特定任务。我需要逐行处理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”循环的情况下实现此任务吗?预先谢谢你!
答案 0 :(得分:1)
有用于此目的的矢量化函数,将快很多:
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
答案 1 :(得分:0)
您可以在以下位置使用numpy:
import numpy as np
df['signal'] = np.where(pd.isnull(df['signal']), df['signal'].shift(1), df['signal'])