vorweg: Ich bin erst vor kurzem in die Programmierung mit Python eingestiegen und mag deshalb noch recht unbeholfen wirken

Mit Hilfe von Pandas read_html Funktion möchte ich eine bestimmte Tabelle (nennt sich "Summary Compensation Table") aus einem bestimmten Formular (DEF 14A) der U.S. Börsenaufsichtsbehörde scrapen. Dieses Formular muss von börsennotierten Unternehmen regelmäßig ausgefüllt und die entsprechende Tabelle eingepflegt werden. Die genaue Form dieser Tabelle unterscheidet sich leider immer ein wenig.
Im folgenden Bild findet ihr ein Beispiel. Um den Aufbau der Tabellen ersichtlicher zu machen, findet ihr auf den Bildern zuerst eine "markierte" Version und zur besseren Lesbarkeit noch eine ohne Markierungen.
https://imgur.com/a/EnyGOLN
Wie man auf der markierten Version sieht, existieren in einigen Spalten mehrzeilige Texte. Als Resultat erhalte ich nach dem durchlaufen des Codes dann folgenden Frame:
https://imgur.com/a/ZUOiUBg
Nun würde ich natürlich gerne einen Zeilenumbruch innerhalb einer Zelle auch in meinem df darstellen, da die Informationen sonst natürlich ziemlich nutzlos sind. In der Spalte "Name and Principal Position" wird jede Textzeile auch in eine neue Tabellenzeile geschrieben. Hier funktioniert die Darstellung somit wie gewollt. In anderen Spalte wie "Year" oder "Salary" leider nicht.
Eine zweite Sache ist die der automatischen Erkennung der Überschriften. Diese funktioniert mal mehr mal weniger gut. In dem hier gezeigten Beispiel eher weniger, was vermutlich an der Multiindex Überschrift liegt.
Ich versuche mich hier gerade an einer Lösung der folgenden Logik: "Behandle über alle Spalten hinweg alles was über den ersten numerischen Wert in der Spalte Year steht als Überschrift". Leider waren meine bisherigen Versuche nicht wirklich von Erfolg gekrönt. Wenn jemand einen Vorschlag für eine Lösung hat wäre ich sehr dankbar.
Code: Alles auswählen
dfs = pd.read_html(resp.text) #Auswahl aller Tabellen auf der Seite
#Auswahl der korrekten Tabelle. Notiz: Geht bestimmt auch schöner/effizienter...
for df in dfs:
df = df.applymap(str)
for i in range(len(list(df))):
if df.iloc[:,i].str.contains('Name').any():
for k in range(len(list(df))):
if df.iloc[:,k].str.contains('Year').any():
for f in range(len(list(df))):
if df.iloc[:,f].str.contains('Salary').any():
CompTab = df
#Anzeigeeinstellung
pd.set_option('display.max_columns', None)
#Aufbereitung der Tabelle#
#Versuch die Überschrift als solche zu erkennen
ind = CompTab[CompTab[0].str.contains('Name', na=False)].index[0] + 1
CompTab = CompTab[ind:].rename(columns={i: ' '.join(CompTab[i][:ind].dropna()) for i in CompTab.columns})
#Spalten/Zeilen entfernen, die nur aus nan bestehen
CompTab.replace('nan', np.nan, inplace=True)
CompTab.dropna(how='all', axis=1, inplace=True)
CompTab.dropna(how='all', axis=0, inplace=True)
CompTab.reset_index(drop=True, inplace=True)
Liebe Grüße