фильтрация фрейма данных, отображение строк в зависимости от значения определенных столбцов - PullRequest
0 голосов
/ 28 мая 2020

У меня есть следующий тип фрейма данных, и я хочу оставить только строки, в которых столбцы с именем «Модель» равны «КУПИТЬ» или «ПРОДАТЬ»

Входные данные:

          Date Ticker IssuerTier     Action  ... ModelG1 ModelG2  ModelG3  ModelG4
0   2020-05-28   AAPL       gold       None  ...   STAND   STAND    STAND    STAND
1   2020-05-28   ABBV       gold  reiterate  ...   STAND   STAND    STAND    STAND
2   2020-05-28   ABMD   standard       None  ...   STAND   STAND    SELL     STAND
3   2020-05-28   ACAD       gold       None  ...   BUY     STAND    STAND    STAND
4   2020-05-28   ADSK   standard       None  ...   STAND   STAND    STAND    STAND
..         ...    ...        ...        ...  ...     ...     ...      ...      ...
130 2020-05-28    WEX       gold       None  ...   STAND   STAND    STAND    STAND
131 2020-05-28   WYNN       gold       None  ...   STAND   STAND    STAND    STAND
132 2020-05-28    ZEN       gold       None  ...   BUY     STAND    STAND    STAND
133 2020-05-28    ZEN       gold  reiterate  ...   STAND   STAND    STAND    STAND
134 2020-05-28    ZEN     silver       None  ...   STAND   STAND    STAND    STAND

[135 rows x 58 columns]

Вывод:

          Date Ticker IssuerTier     Action  ... ModelG1 ModelG2  ModelG3  ModelG4


2   2020-05-28   ABMD   standard       None  ...   STAND   STAND    SELL     STAND
3   2020-05-28   ACAD       gold       None  ...   BUY     STAND    STAND    STAND
132 2020-05-28    ZEN       gold       None  ...   BUY     STAND    STAND    STAND

Я пробовал использовать следующие маски, но по какой-то причине я получил NaN во всех моих фреймах данных:

mask1 = signals.loc[:, 'ModelA1':] == 'BUY'
mask2 = signals.loc[:, 'ModelA1':] == 'SELL'
signals = signals[mask1 & mask2]

Столбцы модели go из A1 , A2, A3, A4 ... в G1, G2, G3, G4.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Не могли бы вы попробовать?

cols_to_check = list(filter(lambda col : col.startswith('Model'), df.columns))

def should_allow(row):
    return all(map(lambda col : row[col] in ('BUY', 'SELL'), cols_to_check))

df = df[df.apply(should_allow, axis=1)]
print(df)
0 голосов
/ 28 мая 2020
model_cols = (cols for cols in signals.columns if cols.startswith("Model"))
mask = signals[model_cols].apply(lambda s: "BUY" in s.values or "SELL" in s.values, axis=1)
signals = signals[mask]

Сначала мы получаем столбцы «модели», затем генерируем маску с вашим условием и используем ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...