给定以下数据框
## example of how to get a "specific" axis point using xs
import pandas as pd
date = pd.bdate_range('2013-01-14','2013-01-20').repeat(5)
sector = [1]*3
sector.extend([2]*2)
sector = sector * 5
instrument = list('ABCDE')*5
port = ['pf']*25
data = xrange(25)
df = pd.DataFrame(dict(port=port,sector=sector,instrument=instrument,date=date,data=data))
port = ['bm']*25
df1 = pd.DataFrame(dict(port=port,sector=sector,instrument=instrument,date=date,data=data))
df = pd.concat([df,df1],axis=0)
df = df.set_index(['port','sector','instrument','date'])
df = df.unstack('port')
df['pchg',''] = xrange(25)
我该怎么做
df['pchg'] * df[['pf','bm']]
预期输出将是具有与df相同的索引并且具有两列的数据帧。
df.pchg * df.bm
和df.pchg * df.pf
谢谢
最佳答案
熊猫使这一过程非常简单。这是一些虚拟数据的示例:
df['data']['pf'] = df['data']['pf'] * df['pchg']
df['data']['bm'] = df['data']['bm'] * df['pchg']
乘法之前:
data pchg
port bm pf
sector instrument date
1 A 2013-01-14 0 0 0
2013-01-15 5 5 1
2013-01-16 10 10 2
2013-01-17 15 15 3
2013-01-18 20 20 4
B 2013-01-14 1 1 5
2013-01-15 6 6 6
2013-01-16 11 11 7
2013-01-17 16 16 8
2013-01-18 21 21 9
C 2013-01-14 2 2 10
2013-01-15 7 7 11
2013-01-16 12 12 12
2013-01-17 17 17 13
2013-01-18 22 22 14
2 D 2013-01-14 3 3 15
2013-01-15 8 8 16
2013-01-16 13 13 17
2013-01-17 18 18 18
2013-01-18 23 23 19
E 2013-01-14 4 4 20
2013-01-15 9 9 21
2013-01-16 14 14 22
2013-01-17 19 19 23
2013-01-18 24 24 24
在乘法之后:
data pchg
port bm pf
sector instrument date
1 A 2013-01-14 0 0 0
2013-01-15 5 5 1
2013-01-16 20 20 2
2013-01-17 45 45 3
2013-01-18 80 80 4
B 2013-01-14 5 5 5
2013-01-15 36 36 6
2013-01-16 77 77 7
2013-01-17 128 128 8
2013-01-18 189 189 9
C 2013-01-14 20 20 10
2013-01-15 77 77 11
2013-01-16 144 144 12
2013-01-17 221 221 13
2013-01-18 308 308 14
2 D 2013-01-14 45 45 15
2013-01-15 128 128 16
2013-01-16 221 221 17
2013-01-17 324 324 18
2013-01-18 437 437 19
E 2013-01-14 80 80 20
2013-01-15 189 189 21
2013-01-16 308 308 22
2013-01-17 437 437 23
2013-01-18 576 576 24
关于python - Pandas 将数据框中的多个多索引列乘以另一列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28343155/