Установить минимальный интервал между значениями - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть следующий фрейм данных, где сортируется столбец value:

df = pd.DataFrame({'variable': {0: 'Chi', 1: 'San Antonio', 2: 'Dallas', 3: 'PHL', 4: 'Houston', 5: 'NY', 6: 'Phoenix', 7: 'San Diego', 8: 'LA', 9: 'San Jose', 10: 'SF'}, 'value': {0: 191.28, 1: 262.53, 2: 280.21, 3: 283.08, 4: 290.75, 5: 295.72, 6: 305.6, 7: 357.89, 8: 380.07, 9: 452.71, 10: 477.67}})

Вывод:

       variable   value
0           Chi  191.28
1   San Antonio  262.53
2        Dallas  280.21
3           PHL  283.08
4       Houston  290.75
5            NY  295.72
6       Phoenix  305.60
7     San Diego  357.89
8            LA  380.07
9      San Jose  452.71
10           SF  477.67

Я хочу найти значения, где расстояние между соседними значениями меньше чем 10:

df['value'].diff() < 10

Вывод:

0     False
1     False
2     False
3      True
4      True
5      True
6      True
7     False
8     False
9     False
10    False
Name: value, dtype: bool

Теперь я хочу равномерно расположить те значения True, которые слишком близки друг к другу. Идея состоит в том, чтобы взять первое значение перед последовательностью True (280.21) и добавить 5 к каждому следующему значению True (накопленная сумма): первое True = 280 + 5, второе True = 280 + 5 + 5, третий True = 280 + 5 + 5 ...

Ожидаемый результат:

       variable   value
0           Chi  191.28
1   San Antonio  262.53
2        Dallas  280.21 
3           PHL  285.21 <-
4       Houston  290.21 <-
5            NY  295.21 <-
6       Phoenix  300.21 <-
7     San Diego  357.89
8            LA  380.07
9      San Jose  452.71
10           SF  477.67

Мое решение:

mask = df['value'].diff() < 10
df.loc[mask, 'value'] = 5
df.loc[mask | mask.shift(-1), 'value'] = last_day[mask | mask.shift(-1), 'value'].cumsum()

Возможно, есть еще элегантный.

1 Ответ

1 голос
/ 14 февраля 2020

Давайте попробуем это:

df = pd.DataFrame({'variable': {0: 'Chi', 1: 'San Antonio', 2: 'Dallas', 3: 'PHL', 4: 'Houston', 5: 'NY', 6: 'Phoenix', 7: 'San Diego', 8: 'LA', 9: 'San Jose', 10: 'SF'}, 'value': {0: 191.28, 1: 262.53, 2: 280.21, 3: 283.08, 4: 290.75, 5: 295.72, 6: 305.6, 7: 357.89, 8: 380.07, 9: 452.71, 10: 477.67}})

s = df['value'].diff() < 10
add_amt = s.cumsum().mask(~s) * 5

df_out = df.assign(value=df['value'].mask(add_amt.notna()).ffill() + add_amt.fillna(0))
df_out

Вывод:

       variable   value
0           Chi  191.28
1   San Antonio  262.53
2        Dallas  280.21
3           PHL  285.21
4       Houston  290.21
5            NY  295.21
6       Phoenix  300.21
7     San Diego  357.89
8            LA  380.07
9      San Jose  452.71
10           SF  477.67
...