Как найти наименьшее значение набора записей в столбце A на основе определенных значений в столбце B? - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть два столбца во фрейме данных, содержащем более 1000 строк.Столбец A может принимать значения X, Y, None.Столбец B содержит случайные числа от 50 до 100.

Каждый раз, когда в столбце A встречается не «None», это считается вхождением4.таким образом, предыдущее не None вхождение в столбце A будет вхождением3, а предыдущее будет вхождением2, а предыдущее - вхождением1.Я хочу найти минимальное значение столбца B между вхождением 4 и вхождением 3 и проверить, не превышает ли оно минимальное значение столбца В между вхождением 2 и вхождением 1.Результаты могут быть сохранены в новом столбце во фрейме данных как «ДА» или «НЕТ».

Пример ввода enter image description here

Например, мне нужнонайти минимальное значение столбца B между ROWNUM 14 и ROWNUM 11 и сравнить его с минимальным значением столбца B между ROWNUM 6 и ROWNUM 3. Далее мне нужно сравнить минимальное значение между ROWNUM 22 и ROWNUM 14 и сравнить его сминимальное значение между ROWNUM 11 и ROWNNUM 6.

ОБНОВЛЕНИЕ:

import numpy as np
import pandas as pd

df = pd.DataFrame([[0, 0]]*100, columns=list('AB'), index=range(1, 101))
df.loc[[3, 6, 11, 14, 22, 26, 38, 51, 64, 69, 78, 90, 98], 'A'] = 1
df['B'] = np.random.randint(50, 100, size=len(df))
df['result'] = df.loc[df['A'] != 0, 'B'].rolling(4).apply(
    lambda x: x[-2:].min() > x[:2].min(), raw=True)
print(df)
df.to_excel("rollingwindow.xlsx",sheet_name="example")

a_guest, я использовал ваш код, и вывод выглядит следующим образом.

enter image description here

Минимальное значение между строкой 22 и строкой 14 равно 56, что больше минимального значения между строками 11 и 6, равного 54. Таким образом, результатом должно быть 1, но ваш код генерирует 0.

1 Ответ

0 голосов
/ 26 сентября 2019

Вы можете использовать скользящее окно для выполнения сравнения:

result = df.loc[df['A'] != 0, 'B'].rolling(4).apply(
    lambda x: x[-2:].min() > x[:2].min(), raw=True)

Если ненулевые элементы не следует сравнивать напрямую, а вместо этого их расположение должно служить границами для определенных диапазонов, тогда вы можете использоватьэта модификация:

result = df.index[df['A'] != 0].to_series().rolling(4).apply(
    lambda x: df.loc[x[2]:x[3], 'B'].min() > df.loc[x[0]:x[1], 'B'].min(), raw=True)

Для справки, вот пример фрейма данных (используя 0 для None и 1 в противном случае, но принцип тот же):

import numpy as np
import pandas as pd

df = pd.DataFrame([[0, 0]]*24, columns=list('AB'), index=range(1, 25))
df.loc[[3, 6, 11, 14, 22], 'A'] = 1
df['B'] = np.random.randint(0, 100, size=len(df))
print(df)

Что выглядит следующим образом:

    A   B
1   0  98
2   0  99
3   1  73
4   0  42
5   0  76
6   1  80
7   0  91
8   0  40
9   0  15
10  0  51
11  1  93
12  0  82
13  0  73
14  1  86
15  0  71
16  0  84
17  0  62
18  0  20
19  0  53
20  0  12
21  0  68
22  1  97
23  0  74
24  0  51
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...