检查前一个值小于x值的谓词;python

2024-05-19 19:48:37 发布

您现在位置:Python中文网/ 问答频道 /正文

import numpy as np
import pandas as pd
    
test = {'temperature' : [15, 26, 24, 23, 26, 29, 25, 24, 19, 16, 15]}
df = pd.DataFrame(data=test)
    
print(df)

  
record = []

for i in df:
 if df['temperature'][df.loc[df['temperature'].lt(df['temperature'])] -1] > df['temperature'][df.loc[df['temperature'].le(df['temperature'])]]:
    record.append(df['temperature'])
 else:
    record.append(np.nan)

df['record'] = record

print(df)

我正在做一个噩梦,根据以下逻辑创建一个新专栏

查找“最高索引小于温度的值”,仅当“最高索引小于温度的值的上一个索引中的值大于”时,才在新列中打印此值

请注意:-仅使用行索引中小于当前“温度”索引的值

步骤1:

对于每个值,我希望找到最高索引小于温度的值,例如,最近小于25的值的索引是3(值23

步骤2:

然后我想检查之前索引中的值是否大于或小于找到的值。下面是步骤1中的示例。在3之前的索引中的值为24,大于23

步骤3:

创建满足步骤的新列打印值和不满足步骤的np.nan

我无法理解这件事

输出如下所示:

    temperature  record
0            15     NaN
1            26     NaN
2            24     NaN
3            23     NaN
4            26     23
5            29     23
6            25     23
7            24     23
8            19     NaN
9            16     NaN
10           15     NaN

Tags: testimportdfasnp步骤nan温度
2条回答

熊猫经常使用优雅的一行程序解决问题。不过,我不确定情况是否如此,所以让我们用手写循环的枯燥方式:

def find_nightmare_value(values, idx):
  j = idx - 1
  while j >= 1 and (values[j] >= values[idx] or values[j-1] <= values[j]): j -= 1
  return values[j] if j >= 1 else np.nan

def nightmare_transform(values):
  return [find_nightmare_value(values, i) for i in range(len(values))]

示例中的用法:

df['record'] = nightmare_transform(df.temperature)

请注意,此实现是二次的,对于长度值不断减小且显著超过10K左右的列,可能变得不切实际。找到问题的线性时间解决方案是一个很好的难题(不过,我怀疑这与您的用例不太相关)

我试图严格遵守你的原始代码。然而,我认为这个记录意味着一个新的温度记录。但是,您的说明似乎只关心当前温度是否高于以前的温度。如果需要记录临时值,则需要知道新临时值大于所有以前的临时值。这就是我在下面代码中使用的假设

import numpy as np
import pandas as pd
    
test = {'temperature' : [15, 26, 24, 23, 26, 29, 25, 24, 19, 16, 15]}
df = pd.DataFrame(data=test)
    
print(df)

record = []

record_temp = -10000
for temp in df['temperature']:
    if  temp > record_temp:
        record.append(temp)
        record_temp = temp
    else:
        record.append(np.nan)

df['record'] = record
print(df)

相关问题 更多 >