Использование shift () для сравнения строк в кадре данных Pandas - PullRequest
0 голосов
/ 10 апреля 2020

Я хотел бы найти ближайшую 'Котировку' для каждой 'Сделки' в столбце Type и использовать shift(), чтобы получить данные от Bid price ближайшей "Котировки" до Prevailing price из " Trade ".

import pandas as pd
df = pd.DataFrame(data=[['Quote', '1.4', '1.4'],
                        ['Quote', '1.6', '1.6'],
                        ['Trade', '10.0', 'NaN'],
                        ['Quote', '1.7', '1.7'],
                        ['Trade', '11.0', 'NaN'],
                        ['Trade', '11.0', 'NaN'],
                       ['Trade', '11.0', 'NaN']],
                  columns=['Type', 'Bid price', 'Prevailing price'])
df['Prevailing price'] = df['Bid price'].shift().where(df['Type'] == 'Trade',df['Bid price'])
print df

Я получаю ошибку в выводе: для непрерывной 'Trade' результат основан на Bid price предыдущей 'Trade' вместо Bid price ближайшего «Цитировать», как index 4-6.

Type    Bid price   Prevailing price
0   Quote   1.4     1.4
1   Quote   1.6     1.6
2   Trade   10.0    1.6
3   Quote   1.7     1.7
4   Trade   11.0    1.7
5   Trade   11.0    11.0
6   Trade   11.0    11.0

Желаемый результат:

Type    Bid price   Prevailing price
0   Quote   1.4     1.4
1   Quote   1.6     1.6
2   Trade   10.0    1.6
3   Quote   1.7     1.7
4   Trade   11.0    1.7
5   Trade   11.0    1.7
6   Trade   11.0    1.7

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 10 апреля 2020

Если возможно, замените Trade строки в Bid price на пропущенные значения на Series.mask, а затем введите последние не пропущенные значения на ffill, используйте:

df['Prevailing price'] = df['Bid price'].mask(df['Type'] == 'Trade').ffill()
print (df)
    Type Bid price Prevailing price
0  Quote       1.4              1.4
1  Quote       1.6              1.6
2  Trade      10.0              1.6
3  Quote       1.7              1.7
4  Trade      11.0              1.7
5  Trade      11.0              1.7
6  Trade      11.0              1.7
...