Pandas DataFrame är en da­ta­struk­tur i Python som kan användas för att skapa och ma­ni­pu­le­ra tabeller. Vi förklarar da­ta­struk­tu­rens upp­bygg­nad och dess vik­ti­gas­te metoder och egen­ska­per.

Hur fungerar Pandas DataFrame?

Pandas Da­taFrames är kärnan i Python Pandas-bib­li­o­te­ket och möjliggör effektiv och flexibel da­taa­na­lys i Python. En Pandas DataFrame är en två­di­men­sio­nell ta­bell­struk­tur med numrerade rader och märkta kolumner. Denna struktur gör det möjligt att or­ga­ni­se­ra data i en lätt­för­stå­e­lig och hanterbar form, liknande kal­kyl­blads­pro­gram som Excel eller Li­bre­Of­fice. Varje kolumn i en DataFrame kan innehålla olika Python-datatyper, vilket innebär att en DataFrame kan lagra he­te­ro­ge­na data – till exempel numeriska värden, strängar och booleska värden i en enda tabell.

Tips

Pandas Da­taFrames baseras på NumPy-matriser, vilket möjliggör effektiv hantering av data och beräkning av värden. Pandas Da­taFrames skiljer sig dock från NumPy-da­ta­struk­tu­rer i vissa avseenden, till exempel när det gäller deras he­te­ro­ge­ni­tet och antal di­men­sio­ner. Av denna anledning är NumPy-da­ta­struk­tu­rer lämpliga för att hantera stora mängder numeriska värden, medan Pandas da­ta­struk­tu­rer är mer lämpade för allmän da­ta­han­te­ring.

Struk­tu­ren hos Pandas Da­taFrames

En DataFrame har tre hu­vud­kom­po­nen­ter: data, radindex och ko­lumn­namn. Ra­din­dex­et (eller helt enkelt index) iden­ti­fi­e­rar varje rad unikt. Som standard indexeras raderna med numeriska värden, men dessa kan ersättas med strängar. Det är viktigt att notera att Pandas Da­taFrames är nollin­dex­e­ra­de, vilket innebär att indexen börjar på 0.

Bild: The structure of a Pandas DataFrame
Pandas Da­taFrames have a tabular structure and are therefore very similar to Excel or SQL tables.
Notis

Pandas Da­taFrames är en av de mest populära och an­vänd­ba­ra da­ta­struk­tu­rer­na i Python, men de ingår inte i bas­språ­ket och måste im­por­te­ras separat. Detta görs med hjälp av rad import pandas eller from pandas import DataFrame i början av filen. Al­ter­na­tivt kan du använda import pandas as pd om du vill referera till modulen med ett kortare namn (i detta fall ”pd”).

An­vänd­ning av Pandas Da­taFrames

Pandas Da­taFrames erbjuder olika tekniker och metoder för effektiv da­ta­be­hand­ling, analys och vi­su­a­li­se­ring. Nedan lär du dig om viktiga begrepp och metoder för da­ta­ma­ni­pu­la­tion med Pandas Da­taFrames.

Hur man skapar en Pandas DataFrame

Om du redan har sparat önskade data i en Python-lista eller Python-ordbok kan du enkelt skapa en DataFrame från den. Skicka bara den be­fint­li­ga da­ta­struk­tu­ren till DataFrame-kon­struk­torn med hjälp av pandas.DataFrame([data]). Hur Pandas tolkar dina data beror på den struktur du till­han­da­hål­ler. Du kan till exempel skapa en Pandas DataFrame från en Python-lista på följande sätt:

import pandas
lists = ["Ahmed", "Beatrice", "Candice", "Donovan", "Elisabeth", "Frank"]
df = pandas.DataFrame(list)
print(df)
# Output:
#            0
# 0     	Ahmed
# 1      	Beatrice
# 2     	Candice
# 3    		Donovan
# 4  	  	Elisabeth
# 5  		Frank
python

Som du kan se i exemplet ovan kan du med enkla listor endast skapa Da­taFrames med en enda, omärkt kolumn. Av denna anledning re­kom­men­de­ras det att skapa Da­taFrames från ordböcker som in­ne­hål­ler listor. Nycklarna tolkas som ko­lumn­namn och listorna som till­hö­ran­de data. Följande exempel il­lu­stre­rar detta:

import pandas
datA = {
    'Name': ['Arthur', 'Bruno', 'Christoph'],
    'Age': [34, 30, 55],
    'Income': [75000.0, 60000.5, 90000.3],
}
df = pandas.DataFrame(data)
print(df)
# Output:
#         Name  Age   Income
# 0     Arthur     34  75000.0
# 1      Bruno     30  60000.5
# 2  Christoph     55  90000.3
python

Med denna metod får DataFrame ome­del­bart önskat format och önskade rubriker. Om du inte vill förlita dig på de inbyggda Python-da­ta­struk­tu­rer­na kan du också ladda dina data från en extern källa, till exempel en CSV-fil eller en SQL-databas. Använd bara lämplig Pandas-funktion:

import pandas
import sqlalchemy
# DataFrame of CSV:
csv = pandas.read_csv("csv-data/files.csv")
# DataFrame of SQL:
engine = create_engine('postgresql://username:password@localhost:5432/mydatabase')
sql = pandas.read_sql_query('SELECT * FROM table', engine)
python

Da­taFrames csv och sql i exemplet ovan in­ne­hål­ler nu alla data från data.csv och SQL-tabellen table. När du skapar en DataFrame från en extern källa kan du ange yt­ter­li­ga­re detaljer, till exempel om de numeriska indexen ska in­klu­de­ras i DataFrame eller inte. Läs mer om de yt­ter­li­ga­re ar­gu­men­ten för de två funk­tio­ner­na på den of­fi­ci­el­la do­ku­men­ta­tions­si­dan för Pandas DataFrame.

Tips

För att skapa en Pandas DataFrame från en SQL-tabell måste du använda Pandas till­sam­mans med ett Python SQL-modul, till exempel SQLAl­che­my. Upprätta en an­slut­ning till databasen med hjälp av det valda SQL-modulet och överför den till read_sql_query().

Hur man visar data i Pandas Da­taFrames

Med Pandas Da­taFrames kan du visa inte bara hela tabellen utan även enskilda rader och kolumner. Du kan välja specifika rader och kolumner att visa. Följande exempel il­lu­stre­rar hur man visar enskilda eller flera rader och kolumner:

# Output 0-th line
print(df.loc[0])
# Output lines 3 to 6
print(df.loc[3:6])
# Output lines 3 and 6
print(df.loc[[3, 6]])
# Output "Occupation" column
print(df["Occupation"])
# Output "Occupation" and "Age" columns
print(df[["Occupation", "Age"]])
# Selection of multiple rows and columns
print(df.loc[[3, 6], ['Occupation', 'Age']])
python

I exemplet refereras till en kolumn genom att använda dess namn inom enkla pa­ren­te­ser, på samma sätt som man kommer åt värden i Python-ordböcker. Däremot används at­tri­bu­tet loc för att referera till rader. Med loc kan man också tillämpa logiska villkor för att filtrera data. Följande kodblock visar hur man endast visar rader där värdet för ”ålder” är större än 30:

print(df.loc[df['Age'] > 30])
python

Du kan dock också använda at­tri­bu­tet iloc för att välja rader och kolumner baserat på deras position i DataFrame. Du kan till exempel visa cellen som finns i den tredje raden och den fjärde kolumnen:

print(df.iloc[3, 4]) 
# Output: 
# London
 
print(df.iloc[[3, 4, 6], 4]) 
# Output: 
# 3 London
# 4 Birmingham
# 6 Preston
python

Hur man itererar över rader med Pandas Da­taFrames

När man bearbetar data i Python är det ofta nöd­vän­digt att iterera över raderna i en Pandas Da­taFrames för att tillämpa samma operation på alla data. Pandas erbjuder två metoder för detta ändamål: itertuples() och iterrows(). Varje metod har sina egna fördelar och nackdelar när det gäller prestanda och an­vän­dar­vän­lig­het.

Metoden iterrows() re­tur­ne­rar en tupel med index och serie för varje rad i DataFrame. En serie är en Pandas- eller NumPy-da­ta­struk­tur som liknar en Python-lista, men som erbjuder bättre prestanda. Du kan komma åt enskilda element i serien med hjälp av ko­lumn­nam­net, vilket förenklar da­ta­han­te­ring­en.

Även om Pandas Series är ef­fek­ti­va­re än Python-listor, medför de fort­fa­ran­de en viss pre­stan­daö­ver­be­last­ning. Därför re­kom­men­de­ras metoden itertuples() särskilt för mycket stora Da­taFrames. Till skillnad från iterrows() re­tur­ne­rar itertuples() hela raden inklusive index som tupler, som är mer pre­stan­das­tar­ka än Series. Med tupler kan du komma åt enskilda element med hjälp av punkt­no­ta­tion, på samma sätt som när du kommer åt attribut för ett objekt.

En annan viktig skillnad mellan serier och tupler är att tupler inte är muterbara. Om du vill iterera över en DataFrame med itertuples() och ändra värden måste du referera till DataFrame med at­tri­bu­tet at och tuplens index. Detta attribut fungerar på ett mycket liknande sätt som loc. Följande exempel il­lu­stre­rar skill­na­der­na mellan iterrows() och itertuples():

import pandas
df = pandas.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'], 
    'Age': [25, 30, 35], 
    'Income ': [70000.0, 80000.5, 90000.3]
})
for index, row in df.iterrows():
        row['Income'] += 1000
        print(f"Index: {index}, Age: {row['Age']}, Income: {row['Income']}")
for tup in df.itertuples():
        df.at[tup.Index, 'Income'] += 1000 # Change value directly in the DataFrame using at[] 
       print(f “Index: {tup.Index}, Age: {tup.Age}, Income: {df.loc[tup.Index, 'Income']}”)
# Both loops have the same output
python
Gå till huvudmeny