Фильтрация строк в кадре данных с использованием нескольких условий - PullRequest
0 голосов
/ 11 октября 2018

Рассмотрим фрейм данных с 4 столбцами -

  • Идентификатор сделки (уникальный идентификатор) - 101,102,103 ...
  • Валютная пара (конкретный список) - AUD, GBP, NZD ..
  • Условное количество (числовое) - Может быть одинаковым для 2 строк
  • Тип сделки (только два типа) - Покупка / продажа

Так что я хочу определитьстроки, которые похожи по валютной паре, условному количеству, но противоположны типам сделок - Buy и Sell

import pandas as pd


trade_id=[1,2,3,4,5,6] #dtype = int64
ccy_pairs=['AUD','AUD','GBP','EUR','NZD','NZD']#dtype = str
notional=[1,1,1.5,2,6,7]#dtype = int64
trade_type=['buy','sell','buy','sell','buy','buy']#dtype = str
value_date=['01012018', '03012019', '05062018','03062018','07082018','09082020']#dtype = datetime

df=pd.DataFrame() #dataframe comprising of many other columns
df['trade_id']=trade_id
df['ccy_pairs']=ccy_pairs
df['notional']=notional
df['trade_type']=trade_type
df['value_date']=value_date



#Output expected - Looking to highlight the offsetting legs of the trade ( i.e. trades having same notional and ccy pair,
#but different trade types )

Trade Id|CCY Pair|Notional|Trade_type|value_date
1 aud 1 Buy 01012018
3 gbp 1.5 Buy 05062018
4 eur 2 Sell 07062018
5 nzd 6 Buy 07082018
6 nzd 7 Buy 09092020

Это означает, что 2 строки, которые совпадали по CCY с условной величиной, но имели противоположные ноги (Buy и Sell), привели кодин из них (любой) упал

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Условие отбрасывания двух строк (одной из них):

"(дублированные строки в ccy_pairs И notional) И (не дублируется в trade_type)"

drop_duplicates не проверяет противостоящие ноги (покупка и продажа).Вы можете попробовать это (я предполагаю, что всегда отбрасывать вторую находку (.index[1])):

dups = df.ccy_pairs[df.ccy_pairs.duplicated()] # to get AUD and NZD

for i in dups: # to check opposing legs
    if df.trade_type[df.ccy_pairs == i].nunique() == 2:
        df.drop(df[df.ccy_pairs == i].index[1], inplace=True)
0 голосов
/ 12 октября 2018

Вам необходимо:

df.drop_duplicates(subset=['ccy_pairs','notional'], keep='first', inplace=True)

выход

    trade_id    ccy_pairs   notional    trade_type  value_date
0   1            AUD        1.0          buy         01012018
2   3            GBP        1.5          buy         05062018
3   4            EUR        2.0          sell        03062018
4   5            NZD        6.0          buy         07082018
5   6            NZD        7.0          buy         09082020

Более подробно см. это

...