我有以下三个数据帧:
df1 = pd.DataFrame(
{
"A_price": [10, 12, 15],
"B_price": [20, 19, 29],
"C_price": [23, 21, 4],
"D_price": [45, 47, 44],
},
index = ['01-01-2020', '01-02-2020', '01-03-2020']
)
df2 = pd.DataFrame(
{
"A_mid": [10, 12, 15],
"B_mid": [20, 19, 29],
"C_mid": [23, 21, 4],
"D_mid": [45, 47, 44],
},
index = ['01-01-2020', '01-02-2020', '01-03-2020']
)
df3 = pd.DataFrame(
{
"A_weight": [0.1, 0.2, 0.4],
"B_weight": [0.2, 0.5, 0.1],
"C_weight": [0.3, 0.2, 0.1],
"D_weight": [0.4, 0.1, 0.4],
},
index = ['01-01-2020', '01-02-2020', '01-03-2020']
)
我定义了以下功能:
def price_weight(df1, df3):
df_price_weight = pd.merge(df1, df3, left_index=True, right_index=True)
if 'close' in df_price_weight.columns:
df_price_weight.filter(regex=('close|weight'))
df_price_weight.columns = df_price_weight.columns.str.split('_', expand=True)
df_price_weight = df_price_weight.sort_index(axis=1)
elif 'price' in df_price_weight.columns:
df_price_weight.filter(regex=('price|weight'))
df_price_weight.columns = df_price_weight.columns.str.split('_', expand=True)
df_price_weight.rename(columns={'price':'close'}, inplace=True)
df_price_weight = df_price_weight.sort_index(axis=1)
else:
df_price_weight.filter(regex=('mid|weight'))
df_price_weight.columns = df_price_weight.columns.str.split('_', expand=True)
df_price_weight.rename(columns={'mid':'close'}, inplace=True)
df_price_weight = df_price_weight.sort_index(axis=1)
return df_price_weight
出于某种原因,当我调用price_weight(df1,df3(时,我没有得到正确的输出。我应该收到一个列为["重量","重量"]的数据帧,但我收到的是["价格","体重"]。
如何使用多个if语句成功定义函数以返回所需的输出?
更新:我正在尝试传递另一个函数
def wmedian(dtfrm):
df = dtfrm.unstack().sort_values('close')
return df.loc[df['weight'].cumsum() > 0.5, 'close'].iloc[0]
其中
dtfrm = price_weight(df1, df3)
wmedian函数应该返回一个价格接近的数据帧,但我得到了"KeyError:"关闭";。
我应该在函数中更改什么?
谢谢。
条件'price' in df_price_weight.columns
永远不会为True,因为确切的字符串'price'
不是列的名称。
相反,我建议:
any(('price' in column_name) for column_name in df_price_weight.columns)