Python 基于多级数据帧中另一列的条件从一列获取数据
使用显示阿尔法-三角洲产品价格和因子的多级数据框,我试图创建一个新的数据系列,其中包含因子最高的两种产品的平均价格。例如,如果阿尔法和布拉沃的因子最高,则阿尔法和布拉沃的平均价格Python 基于多级数据帧中另一列的条件从一列获取数据,python,python-3.x,pandas,numpy,Python,Python 3.x,Pandas,Numpy,使用显示阿尔法-三角洲产品价格和因子的多级数据框,我试图创建一个新的数据系列,其中包含因子最高的两种产品的平均价格。例如,如果阿尔法和布拉沃的因子最高,则阿尔法和布拉沃的平均价格 import pandas as pd import numpy as np index = [np.array(['price', 'price', 'price', 'price', 'factor', 'factor', 'factor', 'factor']), np.array(['al
import pandas as pd
import numpy as np
index = [np.array(['price', 'price', 'price', 'price', 'factor', 'factor', 'factor', 'factor']),
np.array(['alfa', 'bravo', 'charlie', 'delta', 'alfa', 'bravo', 'charlie', 'delta'])]
df = pd.DataFrame(np.random.randn(3, 8), index=['2014', '2015', '2016'], columns=index)
df
Out[1]:
price factor
alfa bravo charlie delta alfa bravo charlie delta
2014 -1.078024 -2.370577 1.809694 0.937910 0.643634 -1.167022 -0.013712 0.026595
2015 -0.374975 1.459360 0.875787 -1.407601 -1.220319 0.604929 0.414953 0.053431
2016 -0.265826 1.261522 0.839443 -0.144880 0.157955 -1.050584 -0.909444 0.687804
您可以使用:
- 对于按级别选择数据帧
- 对于最高值的索引
- 有
每个产品都有3个因素你如何定义最高的因素?你能一行一行地添加你期望的输出(可能有一个简单的例子)。Im采用相同指数(2014年、2015年和2016年)的新数据系列,但其值为具有最高因子的两个数据系列的平均价格。因此,2014年,阿尔法和三角洲的系数最高,我们的平均值为-1.078024和0.93791)
np.random.seed(123)
np.random.seed(123)
index = [['price'] * 4 + ['factor'] * 4, ['alfa','bravo','charlie','delta'] * 2]
df = pd.DataFrame(np.random.rand(3,8), index=['2014', '2015', '2016'], columns=index)
#print (df)
dff = df.xs('factor', axis=1, level=0)
print (dff)
alfa bravo charlie delta
2014 0.719469 0.423106 0.980764 0.684830
2015 0.438572 0.059678 0.398044 0.737995
2016 0.634401 0.849432 0.724455 0.611024
a = (np.argsort(-dff.values, axis=1)[:, :2])
print (a)
[[2 0]
[3 0]
[1 2]]
#check columns with highest values
print (dff.columns[a])
Index([['charlie', 'alfa'], ['delta', 'alfa'], ['bravo', 'charlie']], dtype='object')
dfp = df.xs('price', axis=1, level=0)
print (dfp)
alfa bravo charlie delta
2014 0.696469 0.286139 0.226851 0.551315
2015 0.480932 0.392118 0.343178 0.729050
2016 0.182492 0.175452 0.531551 0.531828
b = dfp.values[np.arange(len(df.index))[:,None], a][:,:2]
print (b)
[[ 0.22685145 0.69646919]
[ 0.72904971 0.4809319 ]
[ 0.17545176 0.53155137]]
c = pd.Series(np.mean(b, axis=1), index=df.index)
print (c)
2014 0.461660
2015 0.604991
2016 0.353502
dtype: float64