在pandas数据框中编写用户定义的fillna函数,以用条件填充np.nan不同的值

用户名

考虑以下熊猫数据框:

import pandas as pd

change = [0.475, 0.625, 0.1, 0.2, -0.1, -0.75, 0.1, -0.1, 0.2, -0.2]
position = [1.0, 1.0, nan, nan, nan, -1.0, nan, nan, nan, nan]
date = ['20150101', '20150102', '20150103', '20150104', '20150105', '20150106', '20150107', '20150108', '20150109', '20150110']
pd.DataFrame({'date': date, 'position': position, 'change': change})

产出

     date        change       position    
    20150101      0.475          1
    20150102      0.625          1
    20150103      0.1            np.nan
    20150104      0.2            np.nan
    20150105      -0.1           np.nan
    20150106      -0.75          -1
    20150107      0.1            np.nan
    20150108      -0.1           np.nan
    20150109      0.2            np.nan
    20150110      -0.2           np.nan

我想用以下规则来填补:

  1. 对于“位置”值为np.nan的行,如果“更改”的值与位置的最后一个非空值具有相同的符号(更改*位置> 0,例如0.1 * 1和0.2 * 1> 0),我们用最后一个非空值填充。

  2. 对于“位置”值为np.nan的行,如果“更改”的值与位置的最后一个非空值具有相同的符号(更改*位置<= 0,例如-1 * 0.1),则用0填充。

  3. 一旦一个np.nan用0填充,接下来的np.nan也将用0填充。

以下是来自示例数据框的预期结果:

     date        change       position    
    20150101      0.475          1
    20150102      0.625          1
    20150103      0.1            1
    20150104      0.2            1
    20150105      -0.1           0
    20150106      -0.75          -1
    20150107      0.1            0
    20150108      -0.1           0
    20150109      0.2            0
    20150110      -0.2           0

编辑:

我开发的方法如下:

while(any(np.isnan(x['position']))):
    conditions = [(np.isnan(x['position'])) & (x['position'].shift(1) * x['change'] > 0),
                  (np.isnan(x['position'])) & (x['position'].shift(1) * x['change'] <= 0)]
    choices = [x['position'].shift(1), 0]
    x['position'] = np.select(conditions, choices, default=x['position'])

但是如您所见,如果您有80,000,000行数据,它的效果不是很好,而且非常慢。

有什么建议?谢谢您的帮助!

约翰

我认为您的代码相当扎实,主要问题是您遍历它的次数比您需要的多。shift()一次只返回一行,但是如果将其更改为,fillna(method='ffill')则基本上可以获得无限制的移位次数,但只需执行一次即可,而不必进行多次迭代(多少迭代取决于您的数据)。

conditions = [
    (np.isnan(x['position'])) & (x['position'].fillna(method='ffill')*x['change']>0),
    (np.isnan(x['position'])) & (x['position'].fillna(method='ffill')*x['change']<=0)]

但我相信您可以进一步,并在最后while添加另一步,从而消除这种情况fillna

conditions = [
    (np.isnan(x['position'])) & (x['position'].fillna(method='ffill')*x['change']>0),
    (np.isnan(x['position'])) & (x['position'].fillna(method='ffill')*x['change']<=0)]

choices=[x['position'].shift(1),0]
x['position'] = np.select(conditions,choices,default=x['position'])

x['position'] = x['position'].fillna(method='ffill')

在示例数据上,第一个更改比代码快约2倍,第二个更改约4倍。我得到的答案与您相同,但您当然需要在真实数据上进行验证,以确保确定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++中不同的NaN值

来自分类Dev

如何用与熊猫数据框中的单独NaN不同的值替换重复的NaN

来自分类Dev

不同的缺失值作为不同数据框列中的列表被替换为 NaN

来自分类Dev

通过查找不同列中的值,使用字典中的键填充 DataFrame 列中的 NaN

来自分类Dev

用R中的用户定义函数替换数据框列值

来自分类Dev

用熊猫中的条件用df填充NaN值

来自分类Dev

用其他系列中的最小值替换数据框中的np.nan

来自分类Dev

如何在pandas数据框中转发填充NaN值?

来自分类Dev

fillna()产生NaN值

来自分类Dev

fillna()产生NaN值

来自分类Dev

尝试在Pandas数据框中添加列时,为什么会得到np.NaN值?

来自分类Dev

尝试在Pandas数据框中添加列时,为什么会得到np.NaN值?

来自分类Dev

根据条件填充Nan值

来自分类Dev

根据非NaN列的值有条件地在Pandas DataFrame中填充NaN值

来自分类Dev

NaN与Go中的NaN不同吗?

来自分类Dev

用NaN替换数据框中的负值,用fillna方法替换NaN

来自分类Dev

用NaN替换数据框中的负值,用fillna方法替换NaN

来自分类Dev

用条件替换数据框中的值与最后一行的值不同

来自分类Dev

用熊猫替换数据框中的NaN值

来自分类Dev

用基于其他列的值填充np.nan

来自分类Dev

使用NaN舍入Pandas数据框列中的值

来自分类Dev

计算数据框中的NaN值

来自分类Dev

用下一个非np.nan值出现的值填充np.nan值

来自分类Dev

用通用值填充DataFrame中的NaN值

来自分类Dev

从其他数据框熊猫填充数据框中的列的NAN值

来自分类常见问题

根据其左侧单元格的值在熊猫数据框中填充NaN值

来自分类Dev

根据条件用不同的替换字典替换pandas数据框列中的值

来自分类Dev

熊猫用列值填充NaN

来自分类Dev

自动填充np.nan用于不同大小的数组

Related 相关文章

  1. 1

    C ++中不同的NaN值

  2. 2

    如何用与熊猫数据框中的单独NaN不同的值替换重复的NaN

  3. 3

    不同的缺失值作为不同数据框列中的列表被替换为 NaN

  4. 4

    通过查找不同列中的值,使用字典中的键填充 DataFrame 列中的 NaN

  5. 5

    用R中的用户定义函数替换数据框列值

  6. 6

    用熊猫中的条件用df填充NaN值

  7. 7

    用其他系列中的最小值替换数据框中的np.nan

  8. 8

    如何在pandas数据框中转发填充NaN值?

  9. 9

    fillna()产生NaN值

  10. 10

    fillna()产生NaN值

  11. 11

    尝试在Pandas数据框中添加列时,为什么会得到np.NaN值?

  12. 12

    尝试在Pandas数据框中添加列时,为什么会得到np.NaN值?

  13. 13

    根据条件填充Nan值

  14. 14

    根据非NaN列的值有条件地在Pandas DataFrame中填充NaN值

  15. 15

    NaN与Go中的NaN不同吗?

  16. 16

    用NaN替换数据框中的负值,用fillna方法替换NaN

  17. 17

    用NaN替换数据框中的负值,用fillna方法替换NaN

  18. 18

    用条件替换数据框中的值与最后一行的值不同

  19. 19

    用熊猫替换数据框中的NaN值

  20. 20

    用基于其他列的值填充np.nan

  21. 21

    使用NaN舍入Pandas数据框列中的值

  22. 22

    计算数据框中的NaN值

  23. 23

    用下一个非np.nan值出现的值填充np.nan值

  24. 24

    用通用值填充DataFrame中的NaN值

  25. 25

    从其他数据框熊猫填充数据框中的列的NAN值

  26. 26

    根据其左侧单元格的值在熊猫数据框中填充NaN值

  27. 27

    根据条件用不同的替换字典替换pandas数据框列中的值

  28. 28

    熊猫用列值填充NaN

  29. 29

    自动填充np.nan用于不同大小的数组

热门标签

归档