Заменить значения в dataframe на разницу с последним значением строки по условию

#python #pandas #dataframe #replace #difference

#python #pandas #dataframe #заменить #разница

Вопрос:

Я пытаюсь заменить каждое значение выше 1000 в моем dataframe на его разницу с предыдущим значением строки.

Именно так я пробовал с pandas:

 data_df.replace(data_df.where(data_df["value"] >= 1000), data_df["value"].diff(), inplace=True)
 

Это не приводит к ошибке, но ничего в dataframe не меняется. Чего мне не хватает?

Ответ №1:

 import numpy as np
import pandas as pd

d = {'value': [1000, 200002,50004,600005], }
data_df = pd.DataFrame(data=d)

data_df["diff"] =  data_df["value"].diff()
data_df["value"] = np.where((data_df["value"]>10000) ,data_df["diff"],data_df["value"])

data_df.drop(columns='diff', inplace=True)
 

Я ввожу один столбец «diff», чтобы получить разницу в предыдущей строке.
np.where позвольте u реализовать оператор if else.

Надеюсь, это поможет вам, спасибо!

Ответ №2:

Вы можете установить значение freq 1000 или любой другой интервал, который вы хотите. У меня оно равно 10, чтобы облегчить просмотр образца. В основном смещение строки, и для каждой строки, где индекс равномерно делится на частоту, используйте сдвинутое значение, в противном случае оставьте как есть.

 import pandas as pd 
import numpy as np

freq = 10
df = pd.DataFrame({'data':[x for x in range(30)]})
df['previous'] = df['data'].shift(1)

df['data'] = np.where((df.index % freq==0) amp; (df.index>0), df['data'] -df['previous'], df['data'])

df.drop(columns='previous', inplace=True)
 

Вывод

     data
0   0.0
1   1.0
2   2.0
3   3.0
4   4.0
5   5.0
6   6.0
7   7.0
8   8.0
9   9.0
10  1.0
11  11.0
12  12.0
13  13.0
14  14.0
15  15.0
16  16.0
17  17.0
18  18.0
19  19.0
20  1.0
21  21.0
22  22.0
23  23.0
24  24.0
25  25.0
26  26.0
27  27.0
28  28.0
29  29.0
 

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

1. @yarvis Не стесняйтесь голосовать и принимать как правильный ответ, чтобы другие могли найти его в будущем! Спасибо

2. к сожалению, не могу проголосовать. Недостаточно репутации.

3. @yarvis нет проблем! Рад, что это помогло.