Ausgabe
Ich habe einige große Excel-Dateien wie diese (Hinweis: Andere Variablen werden der Kürze halber weggelassen):
und müsste einen entsprechenden Pandas DataFrame mit der folgenden Struktur erstellen.
Ich versuche, einen Pandas-Code zu entwickeln, um zumindest die erste Spalte zu analysieren und die ID und die Gesamtheit jedes Benutzers zu transponieren. Können Sie dabei helfen?
Lösung
Die Art und Weise, wie ich es angehen würde, und ich gehe davon aus, dass es wahrscheinlich effizientere Möglichkeiten gibt, besteht darin, die Excel-Datei in einen Datenrahmen zu importieren und sie dann zu durchlaufen, um die Details zu erfassen, die Sie für jede Zeile benötigen. Speichern Sie diese Informationen in einem Wörterbuch und hängen Sie jede gebildete Zeile an eine Liste an. Diese Liste von Wörterbüchern kann dann verwendet werden, um den endgültigen Datenrahmen zu erstellen.
Bitte beachten Sie, dass ich folgende Annahmen getroffen habe:
- Ihre Excel-Datei heißt „data.xlsx“ und befindet sich im aktuellen Arbeitsverzeichnis
- Der Index neben jeder Person erhöht sich JEDES Mal um eins
- Alle Personen haben eine in Klammern neben dem Namen beschriebene Position
- Ich habe die Spaltennamen erfunden, da keine angegeben wurden
import pandas as pd
# import the excel file into a dataframe (df)
filename = 'data.xlsx'
df = pd.read_excel(filename, names=['col1', 'col2'])
# remove blank rows
df.dropna(inplace=True)
# reset the index of df
df.reset_index(drop=True, inplace=True)
# initialise the variables
counter = 1
name_pos = ''
name = ''
pos = ''
line_dict = {}
list_of_lines = []
# iterate through the dataframe
for i in range(len(df)):
if df['col1'][i] == counter:
name_pos = df['col2'][i].split(' (')
name = name_pos[0]
pos = name_pos[1].rstrip(name_pos[1][-1])
p_index = counter
counter += 1
else:
date = df['col1'][i].strftime('%d/%m/%Y')
amount = df['col2'][i]
line_dict = {'p_index': p_index, 'name': name, 'position': pos, 'date':date, 'amount': amount}
list_of_lines.append(line_dict)
final_df = pd.DataFrame(list_of_lines)
Beantwortet von – ScottC
Antwort geprüft von – Senaida (FixError Volunteer)