【问题标题】:How to create a dataframe on two conditions in a lambda function using apply after groupby()?如何在groupby()之后使用apply在lambda函数中的两个条件下创建数据框?
【发布时间】:2020-04-18 16:40:48
【问题描述】:

我正在尝试在数据框中创建投资组合,这取决于变量“范围”,在数据框中的第一个投资组合中保留范围值最高 33% 的行,第二个中的中间 34% 和底部 33% 的行每个时间段和行业的第三个。

到目前为止,我按日期和行业对数据进行了分组

group_first = data_clean.groupby(['date','industry'])

然后使用 lambda 函数来获取每个日期和行业的“范围”的第一个三分位数的行;例如:

port = group_first.apply(lambda x: x[x['scope'] <= x.scope.quantile(0.33)]).reset_index(drop=True)

这适用于第一个和第三个三分位数,但不适用于中间一个,因为我得到了

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

在 lambda 函数中加入两个条件,如下所示:

group_middle = data_clean.groupby(['date','industry'])
port_middle = group_middle.apply(lambda x: (x[x['scope'] > x.scope.quantile(0.67)]) and (x[x['scope'] < x.scope.quantile(0.33)])).reset_index(drop=True)

换句话说,在对日期和行业进行分组后,如何获取包含“范围”中的值的数据帧的行,这些值在第 33 和第 67 个百分位之间?

知道如何解决这个问题吗?

【问题讨论】:

  • 可能会创建普通函数def my_function(x): ...,然后在apply(my_function) 中使用它。在def my_function 内,您将有更多空间添加print() 以查看变量中的值以查看其是否正常工作。
  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图)放在有问题的(不是评论)中。还有其他有用的信息。
  • 我不确定,但熊猫在某些情况下可能需要&amp; 而不是and| 而不是or
  • @furas 感谢您的回复,我已经尝试过使用 & ,不幸的是,它不起作用。你先说的那个功能,我不知道怎么实现……
  • 你不知道如何创建普通函数吗?从lambda 输入代码并使用return。在正常功能中,您可以使用 if/else 并且代码更具可读性并且更容易编写更复杂的东西。但更重要的是,您可以使用 print() 来显示变量中的值(以及计算结果) - 这样您就可以查看它是否正常工作。学习如何使用调试器会更容易。

标签: python lambda pandas-groupby apply quantile


【解决方案1】:

我猜 - 我没有数据来测试它。

您使用错误的&lt;&gt; 并检查scope&lt;33 and scope&gt;67 得到0...33 and 67...100(它可能会给出空数据)但你需要scope&gt;33 and scope&lt;67 才能得到33..67

您也可以使用x[ scope&gt;33 &amp; scope&lt;67 ] 代替x[scope&gt;33] and x[scope&lt;67]

port_middle = group_middle.apply(lambda x: 
   x[ 
      (x['scope'] > x.scope.quantile(0.33)) & (x['scope'] < x.scope.quantile(0.67)
   ]
).reset_index(drop=True)

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 2021-06-09
    • 1970-01-01
    • 2020-01-07
    • 2017-04-16
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多