【问题标题】:Divide One Pandas Dataframe by Another - Ignore index but respect columns将一个 Pandas 数据框除以另一个 - 忽略索引但尊重列
【发布时间】:2015-05-19 13:42:05
【问题描述】:

我有 2 个数据框。 我要广播一个除法操作

df1= pd.DataFrame([[1.,2.,3.,4.], [5.,6.,7.,8.], [9.,10.,11.,12.]],
                  columns=['A','B','C','D'], index=['x','y','z'])

df2= pd.DataFrame([[0.,1.,2.,3.]], columns=['A','B','D','C'], index=['q'])

请注意,df2 中的列对齐方式略有不同。

我想将 df1 除以 df2,其中行被广播但列标签受到尊重。

   A   B   C   D
x  1   2   3   4
y  5   6   7   8
z  9  10  11  12


   A  B  D  C
q  0  1  2  3

这是错误的。

df1.values/df2.values

[[         inf   2.           1.5          1.33333333]
 [         inf   6.           3.5          2.66666667]
 [         inf  10.           5.5          4.        ]]

我想要的答案是:

   A    B   C      D
x  inf  2   1      2
y  inf  6   2.33   4
z  inf  10  3.66   6

【问题讨论】:

    标签: python pandas divide


    【解决方案1】:

    如果你除以一个系列(通过选择第二个数据帧的那一行),pandas 将在第一个数据帧的列上对齐这个系列,给出所需的结果:

    In [75]: df1 / df2.loc['q']
    Out[75]:
         A   B         C  D
    x  inf   2  1.000000  2
    y  inf   6  2.333333  4
    z  inf  10  3.666667  6
    

    如果您不知道/想使用该行的名称,可以使用squeeze 将单列数据框转换为系列:df1 / df2.squeeze()(请参阅@EdChum 的答案)。

    【讨论】:

    • 非常简洁+1
    【解决方案2】:

    可能,您可以订购与 df1 相同的 df2 列,然后除以值

    In [53]: df1.values/df2[df1.columns].values
    Out[53]:
    array([[         inf,   2.        ,   1.        ,   2.        ],
           [         inf,   6.        ,   2.33333333,   4.        ],
           [         inf,  10.        ,   3.66666667,   6.        ]])
    

    【讨论】:

      【解决方案3】:

      您可以对列重新排序,然后调用squeeze 来展平数组,然后调用div

      In [114]:
      
      df1= pd.DataFrame( [[1.,2.,3.,4.],[5.,6.,7.,8.],[9.,10.,11.,12.]] ,columns = ['A','B','C','D'], index = ['x','y','z'])
      df2= pd.DataFrame( [[0.,1.,2.,3.]] ,columns = ['A','B','D','C'], index = ['q'])    ​
      df1.div(df2.ix[:,df1.columns].squeeze())
      
      Out[114]:
           A   B         C  D
      x  inf   2  1.000000  2
      y  inf   6  2.333333  4
      z  inf  10  3.666667  6
      

      df1/df2.ix[:,df1.columns].squeeze() 也可以,但@Joris 的回答要好得多

      编辑

      正如@joris 所指出的,列重新排序是不必要的,因为 pandas 无论如何都会自然地与列对齐,所以:

      df1.div(df2squeeze())
      

      df1./df2squeeze()
      

      会工作

      【讨论】:

      • @EdChum 使用div 时不需要.ix[:,df1.columns] 部分,因为这会自动对齐索引:只需df1.div(df2.squeeze()) 也可以(这也是一个不错的解决方案!)
      • @joris 是的,我想太多了,我喜欢花哨的索引有点太多了,会更新,谢谢
      猜你喜欢
      • 2020-10-22
      • 2019-03-12
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      相关资源
      最近更新 更多