【问题标题】:Specifying an index for Pandas broadcasting operation为 Pandas 广播操作指定索引
【发布时间】:2019-04-30 17:22:28
【问题描述】:

我有一个 Pandas 数据框,我想对其应用条件,并在另一个数据框上使用生成的索引。举个简单的例子:

a = pd.DataFrame(np.array([[1, 1, 2], [1, 2, 2], [2, 2, 1]]), columns=['a', 'b', 'c'])

   a  b  c
0  1  1  2
1  1  2  2
2  2  2  1

b = pd.Series([111, 222, 333], index=['a', 'b', 'c'])

a    111
b    222
c    333

在本例中,我想创建第三个数组,其尺寸与“a”相同,值为 1(或 True),其中 a == 2:

     a    b    c
0    0    0  333
1    0  222  333
2  111  222    0

我的问题是,如何执行这样的操作并指定轴?我怀疑解决方案是以某种方式使用 pd.where,尽管我不想保留任何原始值。

【问题讨论】:

    标签: python pandas broadcasting


    【解决方案1】:

    IIUC

    a.eq(2).mul(b,axis=1)
    Out[803]: 
         a    b    c
    0    0    0  333
    1    0  222  333
    2  111  222    0
    

    正如你提到的pd.where

    a.mask(a==1,0).mask(a==2,b,axis=1)
    Out[834]: 
         a    b    c
    0    0    0  333
    1    0  222  333
    2  111  222    0
    

    【讨论】:

    • 这行得通,尽管在最终实现中数组会非常大,而且 .mul 方法的开销似乎比 pd.where 多很多
    • @triphook 我提供了 where 方法,这里我使用的是 mask
    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多