эффективный способ найти максимальное смещение между повторяющимся целым числом в фрейме данных pandas

#python #pandas

#python #pandas

Вопрос:

Я хочу найти максимальную разницу между двумя последовательными вхождениями одного и того же целого числа эффективным способом. Я могу попробовать цикл, но мой набор данных составляет> 100 000 строк, что невероятно громоздко. У кого-нибудь есть какие-либо предложения?

 data = np.random.randint(5,30,size=100000)
df = pd.DataFrame(data, columns=['random_numbers'])
  

Пример:
В моем примере максимальная разница между этим последовательным появлением 5 равна 29 - 5 = 24 .

 df.loc[79:93].values
array([[ 5],
       [17],
       [ 7],
       [15],
       [25],
       [23],
       [24],
       [22],
       [21],
       [29],
       [25],
       [28],
       [13],
       [19],
       [ 5]])
  

Комментарии:

1. Почему 29 ? Потому что это максимум между двумя 5?

2. да, 29 — это максимальное значение между 2 вхождениями 5

3. итак, вы предоставите целое число, и код должен дать вам максимальное минимальное число чисел между этим целым числом и в следующий раз, когда оно появится, верно?

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

Ответ №1:

Вы можете попробовать это:

 g = df['random_numbers'].eq(5).cumsum()
df.groupby(g).max() - 5
  

Вывод с меньшими данными:

 data = np.random.randint(5,30,size=30)
# array([28, 19, 29, 22, 10, 18, 13, 14, 25, 24, 21, 24, 10, 20, 20,  5, 23,
#         8, 29, 22, 24, 24, 24, 19, 12,  5,  6, 14,  5, 15])

df = pd.DataFrame(data, columns=['rand_nums'])
g = df['rand_nums'].eq(5).cumsum()

# Look at both df and g
# print(pd.concat([df, g], axis=1) # just for explanation.

    rand_nums  rand_nums
0          28          0  ⟶ group 1 starts here
1          19          0
2          29          0
3          22          0
4          10          0
5          18          0
6          13          0
7          14          0  # we take max from here i.e. 29.
8          25          0
9          24          0
10         21          0
11         24          0
12         10          0
13         20          0
14         20          0 ⟶ group1 ends here
15          5          1 ⟶ group2 starts here
16         23          1
17          8          1
18         29          1
19         22          1
20         24          1 # take max from here i.e 29
21         24          1
22         24          1
23         19          1
24         12          1 ⟶ group2 ends here.
25          5          2 ⟶ grp 3 starts here.
26          6          2 # take max from here i.e. 14
27         14          2 ⟶ grp 3 ends here.
28          5          3 ⟶ grp4 starts here. # take max from here i.e. 15
29         15          3 ⟶ grp4 ends here.  

Это дает нам:

 df.groupby(g).max() - 5

           rand_nums
rand_nums           
0                 24
1                 24
2                  9
3                 10
  

Ответ №2:

     df.loc[79:93].max() - df.loc[79:93].min()
  

Редактировать:

 index_integer = df.index[df['random_numbers'] == 5] # change 5 for your 
max_disp = []
for i in index[:-1]:
    max_displ.append(df[index[i]:index[i 1].max() - df[index[i]:index[i 1].mmin())
  

использование списка понимания:

 index_integer = df.index[df['random_numbers'] == 5] # change 5 for your number
max_displ = [df[l[i]:l[i 1]].max() - df[l[i]:l[i 1]].min() for i in range(0,len(l[:-1]))]
  

Комментарии:

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

2. Тогда объясните лучше ….. Код дает тот же результат, что и в примере….