<jupyter_start><jupyter_text>PANDAS Vorbereitungen Quelle: <NAME>, CAS Datenjournalismus MAZ 2018Aufbereitung für meine Basisbedürfnisse ; )  Basics**pip install pandas** - um Pandas zu installieren (Command Line) Importiere benötigte Libraries**import pandas as pd****import numpy as np** - benötigt für Umgang mit NaN's**import datetime**  - für Zeit- und Datumhandling**%matplotlib inline** - zur Visualisierung von Charts**import seaborn as sns** - Charts aufhübschen ; ))) Hilfe nötig?**?** - lass dir helfen (Bsp. schreib type pd.head?)<jupyter_code>import pandas as pd
import numpy as np
import datetime

%matplotlib inline 

import seaborn as sns<jupyter_output><empty_output><jupyter_text>Files einlesen**df = pd.read_csv("filename.csv")** - lädt das File in ein Dataframe, wenn die Originaldateiim gleichen Ordner liegt, wie das JupyterNotebook**df = pd.read_excel("filename.xlsx")** - gleich wie obenstehendLiegt die zu ladende Datei in einem eigenen Ordner:**path = "dataprojects/wherezurichborn/filename.csv"** - in Variable gespeicherter Pfad zur Datei (Schritt 1)**df = pd.read_csv(path)** (Schritt 2)<jupyter_code>df = pd.read_csv("filename.csv")

df = pd.read_excel("filename.xlsx")

path = "Ordnerstruktur/wo_ist_das_file/filename.csv"

df = pd.read_csv(path)<jupyter_output><empty_output><jupyter_text>Files ausgeben/abspeichern**df.to_csv** - sichert ein Dataframe in ein CSV**mit index = False** - sichere die Indexkolonne, die ein Dataframe automatisch erstellt, nicht mit**file_oder_liste.to_csv(path, index=True)** - sortiert Werte in absteigender Anzahl<jupyter_code>df.to_csv (path, index = True)
index = False<jupyter_output><empty_output><jupyter_text>Eine erste Übersicht mit eingelesenen Files**df.head(n)** - zeigt per Standart die ersten fünf Reihen eines Dataframe an (oder wenn n mit einer höheren Zahl angegeben wird, die entsprechende Anzahl Reihen)**df.tail(n)** - zeigt per Standart die **letzten** fünf Reihen eines Dataframe an (oder wenn n mit einer höheren Zahl angegeben wird, die entsprechende Anzahl Reihen)**df.shape** - wie viele Einträge hat das Dataframe?**len(df)** - wie viele Einträge hat das Dataframe?**df.dtypes** - Was für Datenfelder kommen darin vor? (integers, Floats, objects)**df.describe()** - beschreibt das Dataframe**df.columns** - listet alle Kolonnentitel auf**df.values** - Eine Matrix des Frameinhalts, die ausschaut wie ein CSV<jupyter_code>df.head()
df.tail()
df.shape()
len (df)
df.dtypes
df.describe()
df.columns
df.values<jupyter_output><empty_output><jupyter_text>Hat es unschöne Tabs? Und andere Handlings...**sep = "\t"** - für Files, die per Tab getrennt sind**header = None** - falls das csv keinen Header hat**skiprows = n** - überspringt Anzahl n Rows (Reihen)**NaN** - Platzhalter für Not a Number (Missing Data, keine Zahl)**np.nan** - Code für Umgang mit NaN's (braucht Librarie "Numpy" as np)<jupyter_code>sep = "\t"
header = None
skiprows = n
np.nan<jupyter_output><empty_output><jupyter_text>Selecting stuff**df"** - das ganze Dataframe**df.field1** oder **df["field1"]** - eine Kolonne (Spalte) anwählen**df[["field1", "field2"]]** - mehrere Spalten anwählen**df[condition]** - wähle Reihen nur, wenn der Boolean True zutrifft--- Beispiel: condition = df["field" == value]**df.loc[index]** - get row at particular index**df.iloc[integer]** - behandelt einen Index, wie es eine Zahlenreihe wäre**index_col="column"** - definiert die Spalte, die als Index verwendet werden soll<jupyter_code>df.field1
df["field1"]
df[["field1, field2"]]
df[condition]
df.loc[index]
df.iloc[integer]

index_col="column"<jupyter_output><empty_output><jupyter_text>Statistiken aggregieren**.max()** - maximum (Wert)**.min()** - minimum (Wert)**.mean** - Durchschnitt**.std()** - Standart Deviation**.sum()** - Summe**.count()** - zähle**.size()** - useful for double-groups, ähnlich zu value_counts  Dataframes modifizieren**df.copy()** - Kopiert ein Dataframe (anstelle von nur darauf zu referenzieren)**df.set_index("field")** - ändert die Index Spalte zu "field" (Spaltenname, der vergeben wird)  -  **inplace=True** - macht die Änderungen auf dem Objekt, nicht einer Kopie**df.rename_axis("Name")** - Ändert den Namen einer Spalte. Mit "None" dann der Spaltenname gelöscht werden.  -  **inplace=True** - macht die Änderungen auf dem Objekt, nicht einer Kopie<jupyter_code>df.copy()
df.set_index("field")
df.rename_axis("Name")<jupyter_output><empty_output><jupyter_text>Spalten (Columns) in Dataframes modifizieren**df.insert(pos, "field1", values)** - fügt eine neue Spalte "field1" mit pos-Werten ein**df.pop("field1")** - löscht Spalte "field1"**df.assign(newfield = df.["field1"] ... )** - ordnet Werte neuen Spalten zu (original bleibt bestehen)  - **inplace = True** - führt die Änderungen auf den Dataframe aus, keiner Kopie<jupyter_code>df.insert(pos, "field1", values)
df.pop("field1")
df.assign(newfield = df.["field1"]...)<jupyter_output><empty_output><jupyter_text>Zeilen (Rows) in Dataframes modifizieren**df.append(series,dataframe)** - fügt Zeilen ein, gibt ein neues Objekt zurück    - **inplace = True** - führt die Änderungen auf dem Dataframe aus, keiner Kopie**df.drop(df[condition].index)** - löscht Zeilen eines Dataframe nach Conditions  - **inplace = True** - führt die Änderungen auf dem Dataframe aus, keiner Kopie<jupyter_code>df.append(series, dataframe)
df.drop(df[condition].index)<jupyter_output><empty_output><jupyter_text>Datenstrukturen modifizieren**.value_counts()** - zählt Inhalte (integers)**.sort_values** - ordnet Inhalte an  -  **ascending=False** - in absteigender Reihenfolge**df.rename_axis("Name")** - Ändert den Namen einer Spalte. Mit "None" dann der Spaltenname gelöscht werden.  -  **inplace=True** - macht die Änderungen auf dem Objekt, nicht einer Kopie**df.sort_index()** - Sortiert nach Index, nicht nach Werten**df.pivot()** - transformiert lange Datenfiles in weite Datenfiles**df.melt()** - transformiert weite in lange Datenfiles**df.unstack** - transform groupby-subrows into columns (gut für stacked barcharts)**df.transpose** - switches row and columns over the whole dataset (Kurzbefehl: **df.T**)<jupyter_code>df["spalte"].value_counts().sort_values(ascending=False).head(5)
df["spalte"].sort_values
df.sort_index()
df.pivot()
df.melt()
df.unstack()
df.transpose()<jupyter_output><empty_output><jupyter_text>Datenstrukturen gruppieren**df.groupby("field1")["field2"].function ()** - für gruppierten Output (benötigt Kolonnen) und eine funktion**df.groupby(["field1", "field2"])** - Groupby-Befehl auf zwei Leveln<jupyter_code>df.groupby("field1")["field2"].function ()
df.groupby(["field1", "field2"])<jupyter_output><empty_output><jupyter_text>Datenstrukturen kombinieren/verbinden**df.merge(df2)** - verbindet ein Dataframe mit einem zweiten**df.join(df2)** - verbindet/fügt an (join) ein Dataframe mit identischer Anzahl Zeilen zu einem anderen, horizontal**pd.concat([df1, df2])** - fügt alle aufgerufenen Dataframes in einer Liste zusammen, vertikal<jupyter_code>df.merge(df2)
on = "field" # fieldnames to match (if they have the same name)
left_on = "df-field1" #fieldname to match on the left side
right_on = "df2-field" #fieldname to match on right side
left_index= True #weather to use the index as the left-side match field
right_index= True #weather to use the index as the right-side match field
how="inner/left/right/outer" # just like in SQL ?????

df.join(df2)

pd.concat([df1, df2])
axis=1 #fügt horizontal an, nicht vertikal
ignore_index= True #konstruiert neuen Index (verwendet nicht den existierenden)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13647151898734178, 'fraction_numerical': 0.005537974683544304, 'mean_word_length': 6.237595419847328, 'pattern_counts': {'":': 0, '<': 50, '<?xml version=': 0, '>': 50, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '402474', 'license': 'MIT', 'n_tokens_mistral': 2663, 'n_tokens_neox': 2700, 'n_words': 704, 'path': 'Pandas_Vorbereitungen/Pandas Spickzettel.ipynb', 'repo_name': 'Priskawa/kurstag2', 'size': '7590'}