[FIXED] Automatisches Transponieren von Excel-Benutzerdaten in einem Pandas Dataframe

Ausgabe

Ich habe einige große Excel-Dateien wie diese (Hinweis: Andere Variablen werden der Kürze halber weggelassen):

Geben Sie hier die Bildbeschreibung ein

und müsste einen entsprechenden Pandas DataFrame mit der folgenden Struktur erstellen.

Geben Sie hier die Bildbeschreibung ein

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)

AUSGANG:
Geben Sie hier die Bildbeschreibung ein


Beantwortet von –
ScottC


Antwort geprüft von –
Senaida (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like