使用应用于数据框中每一列的多个参数的自定义函数
Custom function using multiple parameters applied to every column in dataframe
我有一个看起来像这样的 df
data = [{'Stock': 'Apple', 'Weight': 0.2, 'Price': 101.99, 'Beta': 1.1},
{'Stock': 'MCSFT', 'Weight': 0.1, 'Price': 143.12, 'Beta': 0.9},
{'Stock': 'WARNER','Weight': 0.15,'Price': 76.12, 'Beta': -1.1},
{'Stock': 'ASOS', 'Weight': 0.35,'Price': 76.12, 'Beta': -1.1 },
{'Stock': 'TESCO', 'Weight': 0.2, 'Price': 76.12, 'Beta': -1.1 }]
data_df = pd.DataFrame(data)
以及将计算加权平均值的自定义函数
def calc_weighted_averages(data_in, weighted_by):
return sum(x * y for x, y in zip(data_in, weighted_by)) / sum(weighted_by)
我想将此自定义公式应用于我的 df 中的所有列,我的第一个想法是 s.th。像这样
data_df = data_df[['Weight','Price','Beta']]
data_df = data_df.apply(lambda x: calc_weighted_averages(x['Price'], x['Weight']), axis=1)
如何固定我的 weighted_by 列并将自定义函数应用到其他列?我最终应该得到价格和 Beta 的加权平均数。
我认为您首先需要所有列的子集,然后使用第二个参数 Weight column
:
s1 = data_df[['Price','Beta']].apply(lambda x: calc_weighted_averages(x, data_df['Weight']))
print (s1)
Price 87.994
Beta -0.460
dtype: float64
没有 apply
的另一个解决方案更快:
s1 = data_df[['Price','Beta']].mul(data_df['Weight'], 0).sum().div(data_df['Weight'].sum())
print (s1)
Price 87.994
Beta -0.460
dtype: float64
我有一个看起来像这样的 df
data = [{'Stock': 'Apple', 'Weight': 0.2, 'Price': 101.99, 'Beta': 1.1},
{'Stock': 'MCSFT', 'Weight': 0.1, 'Price': 143.12, 'Beta': 0.9},
{'Stock': 'WARNER','Weight': 0.15,'Price': 76.12, 'Beta': -1.1},
{'Stock': 'ASOS', 'Weight': 0.35,'Price': 76.12, 'Beta': -1.1 },
{'Stock': 'TESCO', 'Weight': 0.2, 'Price': 76.12, 'Beta': -1.1 }]
data_df = pd.DataFrame(data)
以及将计算加权平均值的自定义函数
def calc_weighted_averages(data_in, weighted_by):
return sum(x * y for x, y in zip(data_in, weighted_by)) / sum(weighted_by)
我想将此自定义公式应用于我的 df 中的所有列,我的第一个想法是 s.th。像这样
data_df = data_df[['Weight','Price','Beta']]
data_df = data_df.apply(lambda x: calc_weighted_averages(x['Price'], x['Weight']), axis=1)
如何固定我的 weighted_by 列并将自定义函数应用到其他列?我最终应该得到价格和 Beta 的加权平均数。
我认为您首先需要所有列的子集,然后使用第二个参数 Weight column
:
s1 = data_df[['Price','Beta']].apply(lambda x: calc_weighted_averages(x, data_df['Weight']))
print (s1)
Price 87.994
Beta -0.460
dtype: float64
没有 apply
的另一个解决方案更快:
s1 = data_df[['Price','Beta']].mul(data_df['Weight'], 0).sum().div(data_df['Weight'].sum())
print (s1)
Price 87.994
Beta -0.460
dtype: float64