I want to multiply a pandas DataFrame df
with Series s
:
df = pd.DataFrame([[0,0,10],[0,1,11],[1,0,12],[1,1,13],[2,0,14],[2,1,15]], columns=['a','b','val'])
s = pd.Series([2,3])
df: s:
a b val
___________ ______
0 0 0 10 0 2
1 0 1 11 1 3
2 1 0 12
3 1 1 13
4 2 0 14
5 2 1 15
such that the indices of the Series [0, 1] are matched with column b
of the DataFrame [0, 1, 0, 1, 0, 1], i.e. I expect the column val
to change from
[10, 11, 12, 13, 14, 15]
to
[20, 33, 24, 39, 28, 45]
It seems like a trivial problem, and I tried MultiIndex
and GroupBy
, .mul()
.apply()
.... I just can't seem to figure it out. Really appreciate your help!
CodePudding user response:
Map s
on b
then multiply by val
:
df['val2'] = df['b'].map(s) * df['val']
Output:
>>> df
a b val val2
0 0 0 10 20
1 0 1 11 33
2 1 0 12 24
3 1 1 13 39
4 2 0 14 28
5 2 1 15 45
>>> df['b'].map(s)
0 2
1 3
2 2
3 3
4 2
5 3
Name: b, dtype: int64
CodePudding user response:
You can also do index matching by using the level
argument of df.mul
:
>>> df['new_val'] = df.set_index('b', append=True)['val']
.mul(s, level=1)
.reset_index(drop=True)