【发布时间】: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”开始)作为文本(不是屏幕截图)放在有问题的(不是评论)中。还有其他有用的信息。
-
我不确定,但熊猫在某些情况下可能需要
&而不是and和|而不是or -
@furas 感谢您的回复,我已经尝试过使用 & ,不幸的是,它不起作用。你先说的那个功能,我不知道怎么实现……
-
你不知道如何创建普通函数吗?从
lambda输入代码并使用return。在正常功能中,您可以使用if/else并且代码更具可读性并且更容易编写更复杂的东西。但更重要的是,您可以使用print()来显示变量中的值(以及计算结果) - 这样您就可以查看它是否正常工作。学习如何使用调试器会更容易。
标签: python lambda pandas-groupby apply quantile