HW3 Collect and Map

Data exploration and cleaning

In this section we will:

  • load the data
  • look at it
  • remove the columns we don't need
  • handle NaN values (ie. remove them)
  • aggregate grants per institution

At the end of that phase we want a DataFrame indicating the total amount of grants each institution has received based on the given data.


In [1]:
# imports
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.pyplot import show

%matplotlib inline
sns.set_context('notebook')
pd.options.mode.chained_assignment = None  # default='warn'

Add a function to control the writes to csv file.


In [2]:
# set to true if you want to write the data to csv
do_persist = True

In [3]:
def write_to_csv(df, file_name):
    if do_persist:
        df.to_csv(file_name)
        print('...done')
        return True
    else:
        return False

Load the data and check the types of the columns


In [4]:
data = pd.read_csv('data/GrantExport.csv', delimiter=';')
data.dtypes


Out[4]:
"Project Number"                int64
Project Title                   object
Project Title English           object
Responsible Applicant           object
Funding Instrument              object
Funding Instrument Hierarchy    object
Institution                     object
University                      object
Discipline Number                int64
Discipline Name                 object
Discipline Name Hierarchy       object
Start Date                      object
End Date                        object
Approved Amount                 object
Keywords                        object
dtype: object

Look at the DF


In [5]:
data.head()


Out[5]:
"Project Number" Project Title Project Title English Responsible Applicant Funding Instrument Funding Instrument Hierarchy Institution University Discipline Number Discipline Name Discipline Name Hierarchy Start Date End Date Approved Amount Keywords
0 1 Schlussband (Bd. VI) der Jacob Burckhardt-Biog... NaN Kaegi Werner Project funding (Div. I-III) Project funding NaN Nicht zuteilbar - NA 10302 Swiss history Human and Social Sciences;Theology & religious... 01.10.1975 30.09.1976 11619.00 NaN
1 4 Batterie de tests à l'usage des enseignants po... NaN Massarenti Léonard Project funding (Div. I-III) Project funding Faculté de Psychologie et des Sciences de l'Ed... Université de Genève - GE 10104 Educational science and Pedagogy Human and Social Sciences;Psychology, educatio... 01.10.1975 30.09.1976 41022.00 NaN
2 5 Kritische Erstausgabe der "Evidentiae contra D... NaN Kommission für das Corpus philosophorum medii ... Project funding (Div. I-III) Project funding Kommission für das Corpus philosophorum medii ... NPO (Biblioth., Museen, Verwalt.) - NPO 10101 Philosophy Human and Social Sciences;Linguistics and lite... 01.03.1976 28.02.1985 79732.00 NaN
3 6 Katalog der datierten Handschriften in der Sch... NaN Burckhardt Max Project funding (Div. I-III) Project funding Abt. Handschriften und Alte Drucke Bibliothek ... Universität Basel - BS 10302 Swiss history Human and Social Sciences;Theology & religious... 01.10.1975 30.09.1976 52627.00 NaN
4 7 Wissenschaftliche Mitarbeit am Thesaurus Lingu... NaN Schweiz. Thesauruskommission Project funding (Div. I-III) Project funding Schweiz. Thesauruskommission NPO (Biblioth., Museen, Verwalt.) - NPO 10303 Ancient history and Classical studies Human and Social Sciences;Theology & religious... 01.01.1976 30.04.1978 120042.00 NaN

We only need the columns 'University' and 'Approved Amount'. All other columns are not relevant for this homework.


In [6]:
# take only the relevant cols and give them nicer names
grants = data[['University', 'Approved Amount']]
grants.rename(columns={'University': 'university', 'Approved Amount' : 'amount'}, inplace=True)
grants.dtypes


Out[6]:
university    object
amount        object
dtype: object

If one of the two values is NaN, we can't use the entry, a grant without institution is as meanningless as a institution without grant. -> We drop it. Note that there are entries with 'Nicht zuteilbar - NA' which are essentially also NaN values.

We drop almost 25% of all entries, which seems a lot, but what else can we do with uncomplete data?


In [7]:
nbr_entries = len(grants)
grants = grants.replace(to_replace='Nicht zuteilbar - NA', value=np.nan)
grants = grants.dropna()
print('Dropped '+str((100/nbr_entries) * (nbr_entries - len(grants)))+'% of all entries.')


Dropped 24.349294189372976% of all entries.

Then make the 'amount' column numeric in order to make the utilisation easier.


In [8]:
grants['amount'] = pd.to_numeric(grants.amount, errors='coerce')

And finally group by the institutions and sum the grants. We show the sorted dataframe It is interesting that neither ETHZ nor EPFL has received the most grants.


In [9]:
universities = grants.groupby(by='university', axis=0, as_index=False).sum()
universities.sort_values('amount', ascending=False)


Out[9]:
university amount
70 Université de Genève - GE 1.838237e+09
68 Universität Zürich - ZH 1.826843e+09
6 ETH Zürich - ETHZ 1.635597e+09
65 Universität Bern - BE 1.519373e+09
64 Universität Basel - BS 1.352251e+09
71 Université de Lausanne - LA 1.183291e+09
5 EPF Lausanne - EPFL 1.175316e+09
69 Université de Fribourg - FR 4.575262e+08
72 Université de Neuchâtel - NE 3.832046e+08
39 NPO (Biblioth., Museen, Verwalt.) - NPO 3.341306e+08
40 Paul Scherrer Institut - PSI 1.152690e+08
17 Firmen/Privatwirtschaft - FP 1.116867e+08
63 Università della Svizzera italiana - USI 8.497055e+07
7 Eidg. Anstalt für Wasserversorgung - EAWAG 7.461922e+07
67 Universität St. Gallen - SG 6.919495e+07
10 Eidg. Material und Prüfungsanstalt - EMPA 5.857452e+07
8 Eidg. Forschungsanstalt für Wald,Schnee,Land -... 4.836039e+07
75 Zürcher Fachhochschule (ohne PH) - ZFH 4.484345e+07
13 Fachhochschule Nordwestschweiz (ohne PH) - FHNW 4.277191e+07
23 Friedrich Miescher Institute - FMI 4.022914e+07
66 Universität Luzern - LU 3.998168e+07
31 Inst. de Hautes Etudes Internat. et du Dév - I... 3.886423e+07
58 Schweizer Kompetenzzentrum Sozialwissensch. - ... 3.473582e+07
24 HES de Suisse occidentale - HES-SO 3.416297e+07
18 Forschungsanstalten Agroscope - AGS 3.311572e+07
2 Berner Fachhochschule - BFH 3.102870e+07
55 SUP della Svizzera italiana - SUPSI 2.404008e+07
29 Idiap Research Institute - IDIAP 2.218311e+07
1 Allergie- und Asthmaforschung - SIAF 1.916996e+07
61 Swiss Center for Electronics and Microtech. - ... 1.806825e+07
... ... ...
3 Biotechnologie Institut Thurgau - BITG 2.492535e+06
49 Pädagogische Hochschule St. Gallen - PHSG 2.098387e+06
9 Eidg. Hochschulinstitut für Berufsbildung - EHB 2.086572e+06
43 Pädagogische Hochschule Bern - PHBern 1.990390e+06
45 Pädagogische Hochschule Luzern - PHLU 1.979281e+06
33 Institut Universitaire Kurt Bösch - IUKB 1.977340e+06
59 Schweizer Paraplegiker Forschung - SPF 1.944211e+06
4 Centre de rech. sur l'environnement alpin - CR... 1.567678e+06
27 Haute école pédagogique fribourgeoise - HEPFR 1.547498e+06
50 Pädagogische Hochschule Thurgau - PHTG 1.526446e+06
26 Haute école pédagogique du canton de Vaud - HEPL 1.430686e+06
34 Institut für Kulturforschung Graubünden - IKG 1.219681e+06
12 Fachhochschule Kalaidos - FHKD 1.090280e+06
35 Instituto Ricerche Solari Locarno - IRSOL 9.512380e+05
48 Pädagogische Hochschule Schwyz - PHSZ 9.365510e+05
25 Haute école pédagogique BE, JU, NE - HEPBEJUNE 6.273800e+05
30 Inst. Suisse de Spéléologie et Karstologie - I... 6.248190e+05
44 Pädagogische Hochschule Graubünden - PHGR 6.146130e+05
54 Robert Walser-Stiftung Bern - RWS 5.695790e+05
52 Pädagogische Hochschule Zug - PHZG 4.957150e+05
56 Schweiz. Hochschule für Logopädie Rorschach - ... 4.296000e+05
51 Pädagogische Hochschule Wallis - PHVS 4.254980e+05
47 Pädagogische Hochschule Schaffhausen - PHSH 1.766910e+05
42 Pädag. Hochschule Tessin (Teilschule SUPSI) - ASP 1.593170e+05
37 Istituto Svizzero di Roma - ISR 1.410000e+05
21 Forschungskommission SAGW 1.000000e+05
22 Franklin University Switzerland - FUS 6.595600e+04
60 Staatsunabh. Theologische Hochschule Basel - STHB 1.730000e+04
16 Fernfachhochschule Schweiz (Mitglied SUPSI) - ... 1.200000e+04
15 Facoltà di Teologia di Lugano - FTL 8.000000e+03

76 rows × 2 columns

Map the institutions to cantons

In this section we will map each institution to the canton it belongs to with following steps:

  1. split the institution name into a 'university_name' and a 'abbreviation' part
  2. query the google places api with the university name (stripped of some special characters) and the keyword 'switzerland'
  3. then take the coorinates returned by google and use the geonames api to find the canton of the coordinates
  4. If for some reason no canton is found (google or geonames did not find any match) we look if the 'university_name' contains a canton name, if so we map it to that canton.

With that method we can map 61 out of the 76 institutions. The rest we mapped manually.

One institution is present in 3 cantons, we just split the grants of it equally among the different cantons. Other institutions are all over the place, those we did not match as it would be too dificult to find all cantons they have a presence in.

Note that there are several 'institutions' that can't be mapped such as 'Weitere Spitäler' (engl: 'other hospitals'). But they only account for ~4% of all grants, which is low enough for us to ignore.

Lets start:

Split the names


In [10]:
delim = ' - '
universities['university_name'] = [fn.split(delim)[0].strip() for fn in universities['university'].values]
universities['abbrev'] = [fn.split(delim)[1].strip() if len(fn.split(delim)) > 1 else np.nan for fn in universities['university'].values]
universities.set_index('university', inplace=True)
universities.head(1)


Out[10]:
amount university_name abbrev
university
AO Research Institute - AORI 3435621.0 AO Research Institute AORI

The functions for using the APIs are situated in the file 'map_universities.py', so we run it.


In [11]:
# run the python file that defines the functions to access the api's
%run map_universities.py

Then match each institution:


In [ ]:
# create a new column with the canton in it.
def canton_for_university_query(uni):
    # create the query
    q = str(uni.university_name) + ' ' + str(uni.abbrev) + ' Switzerland' 
    # remove some special characters in the query
    to_remove = ['(', ')', ',', '.', '-', '+', '&']
    [q.replace(ch, ' ') for ch in to_remove]
    # execute the query
    return canton_for_university(q)

universities['canton'] = universities.apply(canton_for_university_query, axis=1)

How many did we match?


In [13]:
len(universities[~pd.isnull(universities['canton'])])


Out[13]:
62

Show the ones we did not match:


In [14]:
universities[pd.isnull(universities['canton'])]


Out[14]:
amount university_name abbrev canton
university
AO Research Institute - AORI 3.435621e+06 AO Research Institute AORI NaN
Eidg. Material und Prüfungsanstalt - EMPA 5.857452e+07 Eidg. Material und Prüfungsanstalt EMPA NaN
Firmen/Privatwirtschaft - FP 1.116867e+08 Firmen/Privatwirtschaft FP NaN
Forschungsanstalten Agroscope - AGS 3.311572e+07 Forschungsanstalten Agroscope AGS NaN
Forschungskommission SAGW 1.000000e+05 Forschungskommission SAGW NaN NaN
Istituto Svizzero di Roma - ISR 1.410000e+05 Istituto Svizzero di Roma ISR NaN
NPO (Biblioth., Museen, Verwalt.) - NPO 3.341306e+08 NPO (Biblioth., Museen, Verwalt.) NPO NaN
Pädagogische Hochschule Nordwestschweiz - PHFHNW 3.476142e+06 Pädagogische Hochschule Nordwestschweiz PHFHNW NaN
Schweizer Kompetenzzentrum Sozialwissensch. - FORS 3.473582e+07 Schweizer Kompetenzzentrum Sozialwissensch. FORS NaN
Staatsunabh. Theologische Hochschule Basel - STHB 1.730000e+04 Staatsunabh. Theologische Hochschule Basel STHB NaN
Swiss Institute of Bioinformatics - SIB 1.158322e+07 Swiss Institute of Bioinformatics SIB NaN
Weitere Institute - FINST 9.256736e+06 Weitere Institute FINST NaN
Weitere Spitäler - ASPIT 1.074981e+07 Weitere Spitäler ASPIT NaN
Zürcher Fachhochschule (ohne PH) - ZFH 4.484345e+07 Zürcher Fachhochschule (ohne PH) ZFH NaN

Map by hand (using google & wikipedia):

We found following informations for the unmapped institutions

  • Schweizer Kompetenzzentrum Sozialwissensch. -> lausanne -> VD
  • Weitere Institute -> translates to 'other institutes' -> nan
  • Forschungsanstalten Agroscope -> all over the place -> nan
  • Swiss Institute of Bioinformatics -> all over the place -> nan
  • Firmen/Privatwirtschaft -> similar to 'other institutions' -> nan
  • Istituto Svizzero di Roma -> in ROM (italy) -> nan
  • Pädagogische Hochschule Nordwestschweiz -> office in Windisch -> AG
  • Physikal.-Meteorolog. Observatorium Davos -> GR
  • Staatsunabh. Theologische Hochschule Basel -> BS
  • Forschungskommission SAGW -> found nothing (does it still exist?) -> nan
  • NPO (Biblioth., Museen, Verwalt.) -> several institutions -> nan
  • Eidg. Material und Prüfungsanstalt EMPA -> in 3 cantons (BE, ZH, SG) -> split the grant
  • Weitere Spitäler -> several hospitals -> nan
  • 'AO Research Institute - AORI' -> Davos -> GR
  • Zürcher Fachhochschule (ohne PH) - ZFH -> ZH

Map them and show the remaining unmapped institutions:


In [15]:
# do the manual mapping
manual_map = {
        'Schweizer Kompetenzzentrum Sozialwissensch. - FORS' : 'VD',
        'Pädagogische Hochschule Nordwestschweiz - PHFHNW' : 'AG',
        'Physikal.-Meteorolog. Observatorium Davos - PMOD' : 'GR',
        'Staatsunabh. Theologische Hochschule Basel - STHB' : 'BS',
        'AO Research Institute - AORI' : 'GR',
        'Zürcher Fachhochschule (ohne PH) - ZFH' : 'ZH'
    }
for uni_index, ctn in manual_map.items():
    if pd.isnull(universities.at[uni_index, 'canton']):
        universities.set_value(uni_index, 'canton', ctn)
universities[pd.isnull(universities['canton'])]


Out[15]:
amount university_name abbrev canton
university
Eidg. Material und Prüfungsanstalt - EMPA 5.857452e+07 Eidg. Material und Prüfungsanstalt EMPA NaN
Firmen/Privatwirtschaft - FP 1.116867e+08 Firmen/Privatwirtschaft FP NaN
Forschungsanstalten Agroscope - AGS 3.311572e+07 Forschungsanstalten Agroscope AGS NaN
Forschungskommission SAGW 1.000000e+05 Forschungskommission SAGW NaN NaN
Istituto Svizzero di Roma - ISR 1.410000e+05 Istituto Svizzero di Roma ISR NaN
NPO (Biblioth., Museen, Verwalt.) - NPO 3.341306e+08 NPO (Biblioth., Museen, Verwalt.) NPO NaN
Swiss Institute of Bioinformatics - SIB 1.158322e+07 Swiss Institute of Bioinformatics SIB NaN
Weitere Institute - FINST 9.256736e+06 Weitere Institute FINST NaN
Weitere Spitäler - ASPIT 1.074981e+07 Weitere Spitäler ASPIT NaN

In [16]:
canton_grants = universities.groupby(by='canton', axis=0).sum()
canton_grants.sort_values('amount', ascending=False)


Out[16]:
amount
canton
ZH 3.642140e+09
VD 2.401656e+09
GE 1.877102e+09
BE 1.555048e+09
BS 1.392498e+09
FR 4.590737e+08
NE 4.018976e+08
AG 1.261875e+08
TI 1.152623e+08
SG 9.119410e+07
LU 5.467329e+07
SO 4.277191e+07
GR 3.653832e+07
JU 3.479035e+07
VS 2.964409e+07
TG 4.018981e+06
SZ 9.365510e+05
ZG 4.957150e+05
SH 1.766910e+05

The institution EMPA has presence in 3 cantons: BE, ZH, SG. So we split the grants for EMPA and add it to the 3 cantons (1/3 for each)


In [17]:
grants_empa = universities.at['Eidg. Material und Prüfungsanstalt - EMPA', 'amount']
grants_empa_third = grants_empa / 3
empa_cantons = ['BE', 'ZH', 'SG']
for c in empa_cantons:
    canton_grants = canton_grants.set_value(c, 'amount', canton_grants.at[c, 'amount'] + grants_empa_third)
Some numbers on how many we matched.

how many institutions did we match?


In [18]:
# the 1+len(...) accounts for the mapping of EMPA
print(str(round((100/ len(universities) ) * (1+len(universities[~pd.isnull(universities['canton'])]))) )+ '%')


89%

which is how many % of all grants?


In [19]:
total_grants = universities.amount.sum()
matched_grants = canton_grants.amount.sum()
matched_percent = (100/total_grants) * matched_grants
print(str(round(matched_percent, 2) )+ '%')


96.02%

Finally write the canton grants to a csv file


In [20]:
write_to_csv(canton_grants, 'all_canton_grants.csv')


...done
Out[20]:
True

In [21]:
# display all of them
pd.set_option('display.max_rows', None)
universities[['university_name', 'canton']]


Out[21]:
university_name canton
university
AO Research Institute - AORI AO Research Institute GR
Allergie- und Asthmaforschung - SIAF Allergie- und Asthmaforschung GR
Berner Fachhochschule - BFH Berner Fachhochschule BE
Biotechnologie Institut Thurgau - BITG Biotechnologie Institut Thurgau TG
Centre de rech. sur l'environnement alpin - CREALP Centre de rech. sur l'environnement alpin VS
EPF Lausanne - EPFL EPF Lausanne VD
ETH Zürich - ETHZ ETH Zürich ZH
Eidg. Anstalt für Wasserversorgung - EAWAG Eidg. Anstalt für Wasserversorgung ZH
Eidg. Forschungsanstalt für Wald,Schnee,Land - WSL Eidg. Forschungsanstalt für Wald,Schnee,Land ZH
Eidg. Hochschulinstitut für Berufsbildung - EHB Eidg. Hochschulinstitut für Berufsbildung BE
Eidg. Material und Prüfungsanstalt - EMPA Eidg. Material und Prüfungsanstalt NaN
Ente Ospedaliero Cantonale - EOC Ente Ospedaliero Cantonale TI
Fachhochschule Kalaidos - FHKD Fachhochschule Kalaidos ZH
Fachhochschule Nordwestschweiz (ohne PH) - FHNW Fachhochschule Nordwestschweiz (ohne PH) SO
Fachhochschule Ostschweiz - FHO Fachhochschule Ostschweiz SG
Facoltà di Teologia di Lugano - FTL Facoltà di Teologia di Lugano TI
Fernfachhochschule Schweiz (Mitglied SUPSI) - FFHS Fernfachhochschule Schweiz (Mitglied SUPSI) VS
Firmen/Privatwirtschaft - FP Firmen/Privatwirtschaft NaN
Forschungsanstalten Agroscope - AGS Forschungsanstalten Agroscope NaN
Forschungsinstitut für Opthalmologie - IRO Forschungsinstitut für Opthalmologie VS
Forschungsinstitut für biologischen Landbau - FIBL Forschungsinstitut für biologischen Landbau AG
Forschungskommission SAGW Forschungskommission SAGW NaN
Franklin University Switzerland - FUS Franklin University Switzerland TI
Friedrich Miescher Institute - FMI Friedrich Miescher Institute BS
HES de Suisse occidentale - HES-SO HES de Suisse occidentale JU
Haute école pédagogique BE, JU, NE - HEPBEJUNE Haute école pédagogique BE, JU, NE JU
Haute école pédagogique du canton de Vaud - HEPL Haute école pédagogique du canton de Vaud VD
Haute école pédagogique fribourgeoise - HEPFR Haute école pédagogique fribourgeoise FR
Hochschule Luzern - HSLU Hochschule Luzern LU
Idiap Research Institute - IDIAP Idiap Research Institute VS
Inst. Suisse de Spéléologie et Karstologie - ISSKA Inst. Suisse de Spéléologie et Karstologie NE
Inst. de Hautes Etudes Internat. et du Dév - IHEID Inst. de Hautes Etudes Internat. et du Dév GE
Inst. universit. romand de Santé au Travail - IST Inst. universit. romand de Santé au Travail VD
Institut Universitaire Kurt Bösch - IUKB Institut Universitaire Kurt Bösch VS
Institut für Kulturforschung Graubünden - IKG Institut für Kulturforschung Graubünden GR
Instituto Ricerche Solari Locarno - IRSOL Instituto Ricerche Solari Locarno TI
Interkant. Hochschule für Heilpädagogik ZH - HfH Interkant. Hochschule für Heilpädagogik ZH ZH
Istituto Svizzero di Roma - ISR Istituto Svizzero di Roma NaN
Kantonsspital St. Gallen - KSPSG Kantonsspital St. Gallen SG
NPO (Biblioth., Museen, Verwalt.) - NPO NPO (Biblioth., Museen, Verwalt.) NaN
Paul Scherrer Institut - PSI Paul Scherrer Institut AG
Physikal.-Meteorolog. Observatorium Davos - PMOD Physikal.-Meteorolog. Observatorium Davos GR
Pädag. Hochschule Tessin (Teilschule SUPSI) - ASP Pädag. Hochschule Tessin (Teilschule SUPSI) TI
Pädagogische Hochschule Bern - PHBern Pädagogische Hochschule Bern BE
Pädagogische Hochschule Graubünden - PHGR Pädagogische Hochschule Graubünden GR
Pädagogische Hochschule Luzern - PHLU Pädagogische Hochschule Luzern LU
Pädagogische Hochschule Nordwestschweiz - PHFHNW Pädagogische Hochschule Nordwestschweiz AG
Pädagogische Hochschule Schaffhausen - PHSH Pädagogische Hochschule Schaffhausen SH
Pädagogische Hochschule Schwyz - PHSZ Pädagogische Hochschule Schwyz SZ
Pädagogische Hochschule St. Gallen - PHSG Pädagogische Hochschule St. Gallen SG
Pädagogische Hochschule Thurgau - PHTG Pädagogische Hochschule Thurgau TG
Pädagogische Hochschule Wallis - PHVS Pädagogische Hochschule Wallis VS
Pädagogische Hochschule Zug - PHZG Pädagogische Hochschule Zug ZG
Pädagogische Hochschule Zürich - PHZFH Pädagogische Hochschule Zürich ZH
Robert Walser-Stiftung Bern - RWS Robert Walser-Stiftung Bern BE
SUP della Svizzera italiana - SUPSI SUP della Svizzera italiana TI
Schweiz. Hochschule für Logopädie Rorschach - SHLR Schweiz. Hochschule für Logopädie Rorschach SG
Schweiz. Institut für Kunstwissenschaft - SIK-ISEA Schweiz. Institut für Kunstwissenschaft ZH
Schweizer Kompetenzzentrum Sozialwissensch. - FORS Schweizer Kompetenzzentrum Sozialwissensch. VD
Schweizer Paraplegiker Forschung - SPF Schweizer Paraplegiker Forschung LU
Staatsunabh. Theologische Hochschule Basel - STHB Staatsunabh. Theologische Hochschule Basel BS
Swiss Center for Electronics and Microtech. - CSEM Swiss Center for Electronics and Microtech. NE
Swiss Institute of Bioinformatics - SIB Swiss Institute of Bioinformatics NaN
Università della Svizzera italiana - USI Università della Svizzera italiana TI
Universität Basel - BS Universität Basel BS
Universität Bern - BE Universität Bern BE
Universität Luzern - LU Universität Luzern LU
Universität St. Gallen - SG Universität St. Gallen SG
Universität Zürich - ZH Universität Zürich ZH
Université de Fribourg - FR Université de Fribourg FR
Université de Genève - GE Université de Genève GE
Université de Lausanne - LA Université de Lausanne VD
Université de Neuchâtel - NE Université de Neuchâtel NE
Weitere Institute - FINST Weitere Institute NaN
Weitere Spitäler - ASPIT Weitere Spitäler NaN
Zürcher Fachhochschule (ohne PH) - ZFH Zürcher Fachhochschule (ohne PH) ZH

In [ ]: