Предложения для фильтра нескольких подстрок с Python - PullRequest
3 голосов
/ 15 марта 2019
My Dataframe:

enter image description here

или

   Symbol List   mic reuters_exchange_code
12     1COV.DE  XETR                   .DE
13      2GB.DE  XETR                   .DE
14     2HRA.DE  XETR                   .DE
32       3IN.L  XLON                    .L
64       888.L  XLON                    .L
66      93M.DE  XETR                   .DE
70     A1OS.DE  XETR                   .DE
71      A2A.MI  MTAA                   .MI
72      A3M.MC  XMAD                   .MC
73      A4Y.DE  XETR                   .DE
74       A5G.I  XDUB                    .I
76      AAB.CO  XCSE                   .CO
77      AAD.DE  XETR                   .DE
78      AAG.DE  XETR                   .DE
80      AAK.ST  XSTO                   .ST
81     AALB.AS  XAMS                   .AS
82       AAL.L  XLON                    .L
83       AAM.S  XSWX                    .S
84      AAQ.DE  XETR                   .DE
86       AAS.L  XLON                    .L
87        AA.L  XLON                    .L
88      ABBN.S  XVTX                    .S

Есть предложения как это побороть?

В столбце 1 сначала отфильтруйте ' XSWX ' и ' XVTX ', чтобы получить SW 'и' VX 'соответственно .

... затем в столбце 2 заменить только строки ' .S ' на ' SW ' и ' VX '

... чтобы получить результат, показывающий ' AAM.SW ' и ' ABBN.VX ' вместо его текущих ' AAM.S ' и ' AABN.S 'в столбце индекса.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вы хотите использовать np.select, поскольку у вас более одного условия. Таким образом, мы можем исправить нашу reuters_exchange_code колонку. После этого мы заполняем Symbol List, объединяя bats_name с reuters_exchange_code следующим образом:

conditions = [
    (df['mic'] == 'XSWX'),
    (df['mic'] == 'XVTX')
]

choices = ['.SW','.VX']

df['reuters_exchange_code'] = np.select(conditions, 
                                        choices, 
                                        default=df['reuters_exchange_code'])

df['Symbol List'] = df['bats_name'] + df['reuters_exchange_code']

print(df)
   Symbol List bats_name                                  company_name   mic  \
0      1COV.DE      1COV                                   Covestro AG  XETR   
1       2GB.DE       2GB                                   G Energy AG  XETR   
2      2HRA.DE      2HRA                            H&R GmbH & Co KGaA  XETR   
3        3IN.L       3IN                         3i Infrastructure PLC  XLON   
4        888.L       888                              888 Holdings PLC  XLON   
5       93M.DE       93M                            MPH Health Care AG  XETR   
6      A1OS.DE      A1OS                          All for One Steeb AG  XETR   
7       A2A.MI       A2A                                       A2A SpA  MTAA   
8       A3M.MC       A3M  Atresmedia Corp de Medios de Comunicacion SA  XMAD   
9       A4Y.DE       A4Y                       Accentro Real Estate AG  XETR   
10       A5G.I       A5G                                 AIB Group PLC  XDUB   
11      AAB.CO       AAB                      Aalborg Boldspilklub A/S  XCSE   
12      AAD.DE       AAD                               Amadeus Fire AG  XETR   
13      AAG.DE       AAG                                     Aumann AG  XETR   
14      AAK.ST       AAK                                        AAK AB  XSTO   
15     AALB.AS      AALB                        Aalberts Industries NV  XAMS   
16       AAL.L       AAL                            Anglo American PLC  XLON   
17      AAM.SW       AAM                            Anglo American PLC  XSWX   
18      AAQ.DE       AAQ                             AAP Implantate AG  XETR   
19       AAS.L       AAS              Aberdeen Standard Asia Focus PLC  XLON   
20        AA.L        AA                                        AA PLC  XLON   
21     ABBN.VX      ABBN                                       ABB Ltd  XVTX   
22      ABB.MC       ABB                                 AB-Biotics SA  XMAD   
23      ABB.ST       ABB                                       ABB Ltd  XSTO   
24     ABCA.PA      ABCA                                 ABC arbitrage  XPAR   
25     ABEO.PA      ABEO                                       Abeo SA  XPAR   
26       ABF.L       ABF                  Associated British Foods PLC  XLON   
27     ABGP.MC      ABGP                                    Abengoa SA  XMAD   
28      ABG.MC       ABG                                    Abengoa SA  XMAD   
29     ABIO.PA      ABIO                                    Albioma SA  XPAR   

   reuters_exchange_code  
0                    .DE  
1                    .DE  
2                    .DE  
3                     .L  
4                     .L  
5                    .DE  
6                    .DE  
7                    .MI  
8                    .MC  
9                    .DE  
10                    .I  
11                   .CO  
12                   .DE  
13                   .DE  
14                   .ST  
15                   .AS  
16                    .L  
17                   .SW  
18                   .DE  
19                    .L  
20                    .L  
21                   .VX  
22                   .MC  
23                   .ST  
24                   .PA  
25                   .PA  
26                    .L  
27                   .MC  
28                   .MC  
29                   .PA  

Позволяет фильтровать только те строки, которые были изменены, чтобы показать, что это работает:

print(df[(df['mic'] == 'XSWX') | (df['mic'] == 'XVTX')][['Symbol List', 'mic', 'reuters_exchange_code']])

   Symbol List   mic reuters_exchange_code
17      AAM.SW  XSWX                   .SW
21     ABBN.VX  XVTX                   .VX
0 голосов
/ 15 марта 2019

если я понимаю, что вы хотите:

#modify the code .S to SW for XSWX
df.loc[df['reuters_exchange_code'].eq('.S') & df['mic'].eq('XSWX'), 'reuters_exchange_code'] = 'SW'
#modify the code .S to VX for XVTX
df.loc[df['reuters_exchange_code'].eq('.S') & df['mic'].eq('XVTX'), 'reuters_exchange_code'] = 'VX'
:
:
#rebuild the symbol list
df['Symbol List'] = df['bats_name'] + df['reuters_exchange_code']
df = df.set_index('Symbol List')
...