【问题标题】:multiplying rows in dataframe based on row in another datarame pandas根据另一个数据帧熊猫中的行乘以数据帧中的行
【发布时间】:2015-08-28 19:48:17
【问题描述】:

所以我有这个数据框 df1

  Disease  Gene1  Gene2  Gene3  Gene4
      D1    0.1      1     26      1
      D2      1      1      1      1
      D3      1     18    0.5     17
      D4     25      1      1      1
      D5      1      1      1      1
      D6      1     33      1     12
      D7      1    0.3      1      1
      D8      5      1      1      1

还有这个数据框 df2

 Gene1  Gene2    Gene3   Gene4
0   0   1   0
1   0   1   1
1   1   0   0
1   0   1   0
0   1   1   1
0   0   1   0
0   1   0   0
0   0   1   0

只有当 df2 中的该基因存在 1 时,我才想将 df1 中的值相乘。请注意,并非 df1 中的所有值都是 1,有些是小数。

【问题讨论】:

    标签: python pandas conditional-statements dataframe multiplication


    【解决方案1】:

    我不知道你想将 df1 乘以什么,但你可以使用这个:

    >>> df1[df2 == 1] * 5
    

    如果你只想在df2 有的地方乘以df1,你可以这样做:

    >>> df1 * df2.where(df2 == 1, 5).where(df2 != 1, 1)
    

    更新

    In [51]: pd.concat([df1['Disease'], (df1 * df2).sum(axis=1)], axis=1)
    Out[51]: 
        0     1
    0  D1  26.0
    1  D2   3.0
    2  D3  19.0
    3  D4  26.0
    4  D5   3.0
    5  D6   1.0
    6  D7   0.3
    7  D8   1.0
    

    【讨论】:

    • 抱歉没有说清楚。如果 df2 在任何基因下的值为 1,那么对于 df1 ADD 中的每一行(我犯了一个错误,它的加法不相乘)匹配的行。所以结果应该看起来像 D1 26 D2 3 D3 19 D4 26 D5 4 D6 1 D7 0.3 D8 1
    • 这很好,但它似乎使用了所有 df2 我需要它只使用 df2 的特定行。然后将其用于所有 df1 数据帧。这就是我设置另一个帖子的原因。再次抱歉。感谢您的帮助。
    【解决方案2】:

    您可以将 int 值转换为布尔值,然后将其用作掩码:

    In [30]:
    df[df1.astype(bool)] * 10
    
    Out[30]:
      Disease  Gene1  Gene2  Gene3  Gene4
    0     NaN    NaN    NaN    260    NaN
    1     NaN     10    NaN     10     10
    2     NaN     10    180    NaN    NaN
    3     NaN    250    NaN     10    NaN
    4     NaN    NaN     10     10     10
    5     NaN    NaN    NaN     10    NaN
    6     NaN    NaN      3    NaN    NaN
    7     NaN    NaN    NaN     10    NaN
    

    如果您想屏蔽“疾病”列,则只需使用其他 df 列来选择感兴趣的列:

    In [34]:    
    cols = df1.columns
    df[df1.astype(bool)][cols] * 10
    
    Out[34]:
       Gene1  Gene2  Gene3  Gene4
    0    NaN    NaN    260    NaN
    1     10    NaN     10     10
    2     10    180    NaN    NaN
    3    250    NaN     10    NaN
    4    NaN     10     10     10
    5    NaN    NaN     10    NaN
    6    NaN      3    NaN    NaN
    7    NaN    NaN     10    NaN
    

    编辑

    从语义上讲,以下内容将处理您的其他 df 具有除 01 以外的值:

    In [36]:
    cols = df1.columns
    df[df1==1][cols]
    
    Out[36]:
       Gene1  Gene2  Gene3  Gene4
    0    NaN    NaN     26    NaN
    1      1    NaN      1      1
    2      1   18.0    NaN    NaN
    3     25    NaN      1    NaN
    4    NaN    1.0      1      1
    5    NaN    NaN      1    NaN
    6    NaN    0.3    NaN    NaN
    7    NaN    NaN      1    NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2021-03-02
      • 1970-01-01
      相关资源
      最近更新 更多