微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

熊猫DataFrame的逐行处理

如何解决熊猫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”循环的情况下实现此任务吗?预先谢谢你!

解决方法

有用于此目的的矢量化函数,将快很多

df = pd.DataFrame(dict(a=[1,1,np.nan,np.nan],b=[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
,

您可以在以下位置使用numpy:

import numpy as np

df['signal'] = np.where(pd.isnull(df['signal']),df['signal'].shift(1),df['signal'])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。