【问题标题】:Setting dataframe by using both iloc and a boolean mask (mask at multiple different index (row) values in the dataframe)通过同时使用 iloc 和布尔掩码设置数据帧(数据帧中多个不同索引(行)值的掩码)
【发布时间】:2018-08-21 15:11:35
【问题描述】:

我想根据不同 Pandas 数据框中的 Nan 值的位置,将 Pandas 数据框中的值更改为 Nan。我想在数组中的多个位置执行此操作。因此,如果它位于索引(行)值相同的数组的开头,则它可以工作。如果我想将它设置为在箭头中偏移 20 行然后再偏移 40 行,我该怎么做。

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': list(range(0,100)), 'B': list(range(0,100))})


df2_null = df2.isnull()
df[df2_null] = np.NaN


df.iloc[0:4]

df2 = pd.DataFrame({'A': [1, None, 1, 1], 'B': [None, 1, None, 1]})

df2_null = df2.isnull()
df[df2_null] = np.NaN
df.iloc[0:4]

如何让它在下面工作? 因为第一行给出了一个错误,而第二行无论我在哪里执行它都会重现所有 np.Nan 。我一直无法弄清楚如何做到这一点。

df.iloc[20:24][df2_null] = np.Nan
df.loc[df[df2_null].iloc[20:24].index] = np.NaN

【问题讨论】:

    标签: python pandas dataframe pandas-groupby array-broadcasting


    【解决方案1】:

    我认为需要DataFrame.ilocDataFrame.mask,默认情况下通过布尔掩码将值设置为NaN(只需要与所选df 相同的行数和列数和布尔掩码)。

    还将df2_null 掩码转换为 numpy 数组以避免按索引对齐。

    df.iloc[20:24] = df.iloc[20:24].mask(df2_null.values)
    print (df.iloc[15:30])
           A     B
    15  15.0  15.0
    16  16.0  16.0
    17  17.0  17.0
    18  18.0  18.0
    19  19.0  19.0
    20  20.0   NaN
    21   NaN  21.0
    22  22.0   NaN
    23  23.0  23.0
    24  24.0  24.0
    25  25.0  25.0
    26  26.0  26.0
    27  27.0  27.0
    28  28.0  28.0
    29  29.0  29.0
    

    numpy.where 的 Numpy 解决方案,与 pandas 解决方案相同的原理:

    df = pd.DataFrame({'A': list(range(0,30)), 'B': list(range(0,30))})
    
    arr = df.values.astype(float)
    arr[20:24] = np.where(df2_null.values, np.nan, arr[20:24])
    print (arr)
    [[ 0.  0.]
     [ 1.  1.]
     [ 2.  2.]
     [ 3.  3.]
     [ 4.  4.]
     [ 5.  5.]
     [ 6.  6.]
     [ 7.  7.]
     [ 8.  8.]
     [ 9.  9.]
     [10. 10.]
     [11. 11.]
     [12. 12.]
     [13. 13.]
     [14. 14.]
     [15. 15.]
     [16. 16.]
     [17. 17.]
     [18. 18.]
     [19. 19.]
     [20. nan]
     [nan 21.]
     [22. nan]
     [23. 23.]
     [24. 24.]
     [25. 25.]
     [26. 26.]
     [27. 27.]
     [28. 28.]
     [29. 29.]]
    

    【讨论】:

    • 谢谢,我现在会检查并告诉你,但不知道 .mask 函数,所以似乎可以解决问题。
    • 是的,这很好用。是的,这就是我想弄清楚的伎俩。我曾想过其他一些解决方法,但它们都不起作用,因为我没有使用 .values 转换数据框。我习惯用 numpy,所以还是习惯 Pandas。
    • @JSpen - 添加了 numpy 解决方案。
    猜你喜欢
    • 2018-04-18
    • 2018-05-11
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2021-06-06
    • 1970-01-01
    相关资源
    最近更新 更多