Python Pandas: 自某一行以来的最低/最高值

3

我有一个数据集(pd.DataFrame),看起来有点像这样:

date    0
2015 Q4 -1.0
2016 Q1 0.8
2016 Q2 0
2016 Q3 0.1
2016 Q4 0.7
2017 Q1 -0.4
2017 Q2 -0.2
2017 Q3 1.2
2017 Q4 0.8
2018 Q1 -0.4

我试图找到列中数据最后一次与最新行一样低的时间(在这种情况下:应为 2017 年第一季度),并且需要使它在最新数字为正时查找最后一次高峰。
找到后,我需要提取该行的索引值。(在本例中为 '2017 Q1')
我一直在尝试编写类似可憎的代码(我只是最近开始编程):
from heapq import nsmallest
from heapq import nlargest
    def second_smallest(numbers):
        return nsmallest(2, numbers)[-1]
    def second_largest(numbers):
        return nlargest(2, numbers)[-1]


    def next_smallest(df = pd.DataFrame()):
        x = df[-1:].item()
        if x <= 0:
            y = df[df>= x]
            second = second_smallest(y)
            return  df.index[df == second].tolist() 

我使用的方法没有给我所需的结果,所以非常需要帮助。我已经找了一段时间,但要么是我的搜索词不对(因为我是用第二语言搜索的),要么是关于如何做到这一点的资料不多。

非常感谢。


1
为了确保我理解问题正确,您是说:“我正在尝试找到我的列中数据最后一次达到最新行的低点(在这种情况下:应该是在2015年Q4)”。在这个例子中,不应该是2017年Q1吗?最新的行是2018年Q1,值为-0.4,而2017年Q1的值为-0.4,比2015年Q4晚。 - Kent Munthe Caspersen
啊,是的,你说得对。我的最新点之前是-0.5,这样做有意义,但你是正确的。我会进行编辑,谢谢。 - Alex
2个回答

2

这是否给您提供了想要的内容?

if df.value.iloc[-1] < 0: 
    idx = df.index[df.value<=df.value.iloc[-1]][-2]
else:
    idx = df.index[df.value>=df.value.iloc[-1]][-2]

date = df.date.iloc[idx]    

我收到了 "AttributeError: 'DataFrame' object has no attribute 'value'" 的错误。也许应该指定它是一个 df?我在帖子中添加了这个信息。 - Alex
抱歉,我把你的“0”列重命名为“value”,使用df.columns = ['date', 'value'] - screenpaver
哦,明白了,这很有道理。当我使用我为其命名的名称时,它可以完美地工作。比我之前尝试的奇怪方法要容易得多,非常感谢! - Alex

0
将第一列标记为“id”,第二列标记为“value”,一种方法是识别所有具有相同值的行作为最新行,然后获取具有此值的最后日期。请参见以下模拟数据:
df = pd.DataFrame({'id': ['date1', 'date2', 'date3', 'date4', 'date5', 'date6', 'date7', 'date8'], 'value': [3, -1, 0, 3, 2, 5, 4, 3]})
df_same_value_as_latest = df.loc[df['value']==df['value'].tolist()[-1]]
date_required = df_same_value_as_latest.iloc[df_same_value_as_latest.shape[0]-2,:]['id']
print(date_required)

我的数据集比我粘贴的(为了清晰)有更多的小数,所以我认为这会引起问题?而且可能存在没有2个相等值的潜在问题,我认为这也会导致错误。 - Alex
在你的问题中,你确实说了“相等”...我想你可以对你的数据应用四舍五入,但这可能不是理想的选择,或者我的答案可以被修改为适用于大于或小于条件,尽管那将变得几乎与已接受的答案相同。 - Jimmy
是的,抱歉如果我表达不清楚,相等是可以的,但有可能没有相等的点,这种情况下我需要最接近的点,例如:如果下一次添加行时值为-0.6。但还是谢谢你的回答! - Alex
非常欢迎您 :) 如果是这样,从技术上讲,答案应该是最新行的日期 - 这取决于您想要实现什么! - Jimmy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接