【问题标题】:Python: define function with multiple if statements and return outputPython:使用多个 if 语句定义函数并返回输出
【发布时间】:2021-12-28 20:43:39
【问题描述】:

我有以下三个数据框:

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) 时,我没有得到正确的输出。我应该收到一个包含 ['close', 'weight'] 列的数据框,但我收到了 ['price', 'weight']。

如何成功定义一个包含多个 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: 'close'”。

我应该在函数中更改什么?

谢谢。

【问题讨论】:

  • 你从df_price_weight.columns得到什么结果?当您查看该结果时,您是否希望 if 'close' in df_price_weight.columns: 满意?是吗?提示:如果你尝试'x' in ['xx']会发生什么?

标签: python pandas dataframe function if-statement


【解决方案1】:

条件'price' in df_price_weight.columns 永远不会为真,因为确切的字符串'price' 不是列名。

相反,我建议:

any(('price' in column_name) for column_name in df_price_weight.columns)

【讨论】:

  • 请查看我帖子中的更新。您的解决方案适用于第一个函数,但我试图通过第二个函数但没有运气。你知道似乎是什么问题吗?谢谢。
  • @MathMan99 请不要编辑您的问题来添加新的、看似无关的问题。而是将其作为新问题发布。但尝试在新问题中包含minimal reproducible example。一个从头开始重建的例子,它专注于问题而不是别的。我们不是来为您调试代码的。
  • @MathMan99 例如,您的第一个问题包含很多复杂的内容:合并 pandas 数据帧、使用正则表达式过滤、拆分字符串、重命名列等。但实际问题只是关于 @ 的行为987654325@ 获取字符串列表。如果你努力隔离这个确切的问题并将问题集中在那个问题上,那就更好了。事实上,如果你这样做了,你可能会自己找到解决方案。
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2018-02-26
  • 2013-12-05
相关资源
最近更新 更多