Необходимо извлечь последовательность отрицательных значений, где предыдущее отрицательное значение меньше текущего значения, а следующее значение меньше текущего значения.
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.25
на -0.45
?
почему ранее -0,1 было меньше -0,2 в ожидаемом вами результате? вы имеете в виду абсолютную ценность?
Вы можете создавать маски для идентификации отрицательных значений и последовательно уменьшающихся значений и использовать 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.
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]]
'''
Вы уверены в желаемом результате? потому что, если и предыдущее, и следующее значения должны быть меньше текущего значения, я не понимаю, как можно извлечь какие-либо значения из желаемого вывода. Аналогично текущему значению -0,4: -0,4 < -0,3 и -0,4 < -0,35.