Последовательность извлечения Pandas, где предыдущее значение> текущее значение

Необходимо извлечь последовательность отрицательных значений, где предыдущее отрицательное значение меньше текущего значения, а следующее значение меньше текущего значения.

import pandas as pd

# Create the DataFrame with the given values
data = {
    'Value': [0.3, 0.2, 0.1, -0.1, -0.2, -0.3, -0.4, -0.35, -0.25, 0.1, -0.15, -0.25, -0.13, -0.1, 1]
}
df = pd.DataFrame(data)
print("Original DataFrame:")
print(df)

Мой код:

# Initialize a list to hold the sequences
sequences = []
current_sequence = []

# Iterate through the DataFrame to apply the condition
for i in range(1, len(df) - 1):
    prev_value = df.loc[i - 1, 'Value']
    curr_value = df.loc[i, 'Value']
    next_value = df.loc[i + 1, 'Value']
    
    # Check the condition
    if curr_value < prev_value and curr_value < next_value:
        current_sequence.append(curr_value)
    else:
        # If the current sequence is not empty and it's a valid sequence, add it to sequences list and reset
        if current_sequence:
            sequences.append(current_sequence)
            current_sequence = []

# Add the last sequence if it's not empty
if current_sequence:
    sequences.append(current_sequence)

Мой результат:

Extracted Sequences:
[-0.4]
[-0.25]

Ожидаемый результат:

[-0.1,-0.2,-0.3,-0.4]
[-0.15,-0.25]

Вы уверены в желаемом результате? потому что, если и предыдущее, и следующее значения должны быть меньше текущего значения, я не понимаю, как можно извлечь какие-либо значения из желаемого вывода. Аналогично текущему значению -0,4: -0,4 < -0,3 и -0,4 < -0,35.

antoine 21.06.2024 15:14

Не могли бы вы дать ожидаемый результат, если заменить -0.25 на -0.45?

mozway 21.06.2024 15:46

почему ранее -0,1 было меньше -0,2 в ожидаемом вами результате? вы имеете в виду абсолютную ценность?

SomeDude 21.06.2024 16:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
73
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете создавать маски для идентификации отрицательных значений и последовательно уменьшающихся значений и использовать groupby для разделения:

# is the value negative?
m1 = df['Value'].lt(0)

# is the value decreasing?
m2 = df['Value'].diff().le(0)

m = m1&m2

# aggregate
out = df[m].groupby((~m).cumsum())['Value'].agg(list).tolist()

Выход:

[[-0.1, -0.2, -0.3, -0.4], [-0.15, -0.25]]

Если вы просто хотите отфильтровать:

out = df[m]

Выход:

    Value
3   -0.10
4   -0.20
5   -0.30
6   -0.40
10  -0.15
11  -0.25

Промежуточные продукты:

    Value     m1  df['Value'].diff()     m2  m1&m2
0    0.30  False                 NaN  False  False
1    0.20  False               -0.10   True  False
2    0.10  False               -0.10   True  False
3   -0.10   True               -0.20   True   True
4   -0.20   True               -0.10   True   True
5   -0.30   True               -0.10   True   True
6   -0.40   True               -0.10   True   True
7   -0.35   True                0.05  False  False
8   -0.25   True                0.10  False  False
9    0.10  False                0.35  False  False
10  -0.15   True               -0.25   True   True
11  -0.25   True               -0.10   True   True
12  -0.13   True                0.12  False  False
13  -0.10   True                0.03  False  False
14   1.00  False                1.10  False  False

Мое решение:

import pandas as pd

# Create the DataFrame with the given values
data = {
    'Value': [0.3, 0.2, 0.1, -0.1, -0.2, -0.3, -0.4, -0.35, -0.25, 0.1, -0.15, -0.25, -0.13, -0.1, 1]
}
df = pd.DataFrame(data)
def select_rows_based_on_criteria2(df, column_name):
    selected_indices = []

    for i in range(1, len(df) - 1):  # Skip the first and last rows for comparison
        prev_value = df[column_name].iloc[i - 1]
        curr_value = df[column_name].iloc[i]
        next_value = df[column_name].iloc[i + 1]

        if curr_value < 0 and next_value < curr_value: #prev_value < 0 and
            # selected_indices.append(df.index[i - 1])
            selected_indices.append(df.index[i])
            selected_indices.append(df.index[i + 1])
            # selected_indices.append(df.index[i + 2])
            # selected_indices.append(df.index[i + 3])
            # selected_indices.append(df.index[i + 4])
    # Use a set to avoid duplicate indices and then sort them
    selected_indices = sorted(set(selected_indices))
    selected_rows = df.loc[selected_indices]

    return selected_rows
selected_rows41 = select_rows_based_on_criteria2(df, 'Value')
selected_rows41

Выход:

Value
3   -0.10
4   -0.20
5   -0.30
6   -0.40
10  -0.15
11  -0.25

Пожалуйста, не используйте вышеуказанное решение. Пройдите коды, предоставленные мной и моим другом mozway.@Divyank.

Soudipta Dutta 09.07.2024 06:44
import pandas as pd
import numpy as np


data = {'Value': [0.3, 0.2, 0.1, -0.1, -0.2, -0.3, -0.4, -0.35, -0.25, 0.1, -0.15, -0.25, -0.13, -0.1, 1]}
df = pd.DataFrame(data)
print(df)

values = df['Value'].values

negative = values < 0
df['negative'] = negative

decreasing = np.concatenate(([False], np.diff(values) <= 0))
df['decreasing'] =decreasing

mask = negative & decreasing
df['mask'] =mask
print(df)
'''
    Value  negative  decreasing   mask
0    0.30     False       False  False
1    0.20     False        True  False
2    0.10     False        True  False
3   -0.10      True        True   True
4   -0.20      True        True   True
5   -0.30      True        True   True
6   -0.40      True        True   True
7   -0.35      True       False  False
8   -0.25      True       False  False
9    0.10     False       False  False
10  -0.15      True        True   True
11  -0.25      True        True   True
12  -0.13      True       False  False
13  -0.10      True       False  False
14   1.00     False       False  False
'''
start_sequence = np.where(mask[1:] & ~mask[:-1])[0] +1 
print(start_sequence)#[ 3 10]

end_sequence =  np.where(~mask[1:] & mask[:-1])[0] +1 
print(end_sequence)#[ 7 12]

desired_sequence = [values[start:end].tolist() for start,end in zip(start_sequence,end_sequence)]
print(desired_sequence )

'''
[[-0.1, -0.2, -0.3, -0.4], [-0.15, -0.25]]
'''

Другие вопросы по теме