#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. Тогда объясните лучше ….. Код дает тот же результат, что и в примере….