multiplying rows in dataframe based on row in another datarame pandas

1.6k views Asked by At

So i have this dataframe 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

Also this dataframe 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

i want to multiply the values in df1 only if the 1 is present for that gene in df2. Please note not all the values are 1's in df1 some are decimals.

2

There are 2 answers

0
EdChum On

You can convert the int values to a boolean and then use this as a mask:

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

If you want to mask out the 'Disease' column then just use the other df columns to select the cols of interest:

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

EDIT

Semantically the following will handle where your other df has values other than 0 and 1:

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
2
Roman Pekar On

I don't get what exactly do you want to multiply df1 by, but you can use this:

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

If you want to multiply df1 only in the places where df2 has ones, you can do this:

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

update

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