【问题标题】:Set cell value in Pandas DataFrame based on a value in another DataFrame with same index/column names根据另一个具有相同索引/列名的 DataFrame 中的值设置 Pandas DataFrame 中的单元格值
【发布时间】:2017-12-22 15:07:45
【问题描述】:

我有一个如下所示的 Pandas DataFrame,具有每小时时间索引和对应于特定位置的列名:

df1.head()

                        33643  33667  33668  33677  33678  33680  33681  33686
   1998-01-01 10:00:00    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   
   1998-01-01 11:00:00    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   
   1998-01-01 12:00:00    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   
   1998-01-01 13:00:00    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   
   1998-01-01 14:00:00  322.0  343.0  323.0  341.0  342.0  342.0  341.0  343.0 

我有第二个 Pandas DataFrame,其索引和列名相同,但变量不同。

df2.head()

                        33643   33667   33668   33677   33678   33680   33681
   1998-01-01 10:00:00  289.59  286.07  286.52  284.77  285.17  284.17  284.44   
   1998-01-01 11:00:00  289.83  286.31  286.76  285.00  285.40  284.39  284.66   
   1998-01-01 12:00:00  290.08  286.63  287.08  285.33  285.73  284.73  284.99   
   1998-01-01 13:00:00  290.39  287.27  287.68  286.10  286.46  285.56  285.80   
   1998-01-01 14:00:00  291.10  289.14  289.39  288.42  288.64  288.09  288.23

我想找到 df1 中的值等于 np.nan 的位置,如果是,则为 df2 中的相应单元格插入 np.nan。我试过查看docs,但我没有发现它们有多大用处。其他 Stackoverflow 页面并不是很有帮助。这是我想要的输出:

df3.head()

                        33643  33667  33668  33677  33678  33680  33681  33686
   1998-01-01 10:00:00    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   
   1998-01-01 11:00:00    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   
   1998-01-01 12:00:00    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   
   1998-01-01 13:00:00    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   
   1998-01-01 14:00:00  291.10  289.14  289.39  288.42  288.64  288.09  288.23 289.12

我尝试过的事情:

df3 = pd.DataFrame(np.where(df1[:] == np.nan, df2[:] == np.nan, df2[:]))

df3 = df2.where(df1.iloc[:,:] == np.nan, np.nan)

有什么建议吗?我走对了吗?

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    其实你离解决方案不远了,事实上,你的想法是对的。但如果我必须推荐一种方法,我会推荐使用pandas.notnull

    df3 = df2[pd.notnull(df1)]
    

    您只需从df2 中选择单元格,其中df1not null 并将它们放入df3 的相应单元格中,所有其他单元格将自动设置为NaN

    如果您仍想使用np.where,您可以使用pandas.isnull 执行类似的操作:

    df3 = pd.DataFrame(np.where(pd.isnull(df1),np.nan,df2))
    

    但是您必须使用columns 参数来重命名列。而且这个方法有点慢,所以我个人不会真正使用它。

    希望这对您有所帮助。

    输出(我只在我的样本中取了你的前 2 列,只是为了更快):

                         33643   33667
    1998-01-01 10:00:00    NaN     NaN
    1998-01-01 11:00:00    NaN     NaN
    1998-01-01 12:00:00    NaN     NaN
    1998-01-01 13:00:00    NaN     NaN
    1998-01-01 14:00:00  291.1  289.14
    

    【讨论】:

    • 太棒了,pd.notnull() 效果很好。我倾向于过度思考这些事情并尝试提出一些非常复杂的切片技术。谢谢!
    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 2012-11-30
    • 2017-09-02
    相关资源
    最近更新 更多