【问题标题】:How do I set the cell values in one dataframe based on the values in two other dataframes?如何根据其他两个数据框中的值设置一个数据框中的单元格值?
【发布时间】:2018-09-20 19:26:50
【问题描述】:

我有三个形状相同的数据框,如下面的人为数据所示。如果 df1 中的单元格值大于 df2 中的相应单元格值,我想遍历 df1 并将信号数据帧中每个单元格的值设置为 1。有人可以说明如何实现吗?

import pandas as pd

cols = ['ABC', 'DEF', 'GHI']
prices = [[12.22, 14.34, 98.34], [12.52, 15.34, 96.34], [13.12, 14.73, 97.47]]
prices_df1 = [[16.11, 18.12, 19.13], [16.21, 18.22, 19.23], [16.31, 18.32, 19.33]]
prices_df2 = [[12.22, 18.34, 17.34], [17.52, 18.34, 19.34], [13.12, 14.73, 16.47]]
mydates = ['09-15-2018', '09-16-2018', '09-17-2018']


signals = pd.DataFrame(index=mydates, columns=cols, data=0)
df1 = pd.DataFrame(index=mydates, columns=cols, data=prices_df1)
df2 = pd.DataFrame(index=mydates, columns=cols, data=prices_df2)

如果 df1 > df2 ,我如何将信号数据帧设置为 1

【问题讨论】:

    标签: pandas dataframe iteration


    【解决方案1】:

    你可以使用 df.where

    signals = signals.where(df1 < df2).fillna(1).astype(int)
    signals
    
    
               ABC  DEF GHI
    09-15-2018  1   1   0
    09-16-2018  1   1   0
    09-17-2018  1   1   0
    

    【讨论】:

    • 如果我想在df1大于df2时插入一个“1”,为什么表达式使用(df1 &lt; df2)而不是(df1 &gt; df2)?这似乎与我的预期相反。
    • 我想我明白了,逻辑过滤器会创建 nans,然后它们会通过 fillna 获得 1 的内容。
    【解决方案2】:

    您可以使用快速布尔过滤器。

    # better speed if boolean to integer conversion is separate from
    # the boolean comparison
    signals = (df1 > df2)
    signals = signals.astype(int)
    
    print(signals)
    
               ABC DEF GHI
    09-15-2018   1   1   0
    09-16-2018   1   1   0
    09-17-2018   1   1   0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2017-02-12
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      相关资源
      最近更新 更多