waarom Pandas
Pandas helps to carry out your entire data analysis workflow in Python without having to switch to a more domain specific language like RDataframe = pythonic analog of R's dataframe
Data-science met python gebruik dan PANDAS
dmv het manipuleren van python pandas dataframes kan
- exploration data-analysis
- data-wrangling
- datapreprocessing
- building models
- visualization
https://www.youtube.com/watch?v=8uK65aNfQ3I
Panda vs Numpy
Numpy: voor berekeningen met getallen. Vooral voor matrix en vector. Sci-kitPandas: voor gestructureerde data
import flat files
# Import pandas as pdimport pandas as pd
# Assign the filename: file
file = opa.csv'
# Read the file into a DataFrame: df
df = pd.read_csv(file)
#je kan ook een dataframe vullen via een python dictionary
Basisfuncties
# Dataframe is about rows and columns#geeft dimensies van rijen en kolommen
df.shape
bijv : rows, columns =df.shape
# View the head of the DataFrame
print(df.head())
# View de last records
df.tail()
indexing and slicing
# print rij 2 to 4df[2:5]
# print alle columns
df.columns
print(list(dfnew.columns))
# print content column
df.windspeed
of
df['windspeed']
# geeft type van column
type(df['windspeed']
#alleen paar kolumns
df[['event']['windspeed']]
Operations Pandas
# maximum,meandf['temperature']. max()
#geef statistics data
df.describe()
Select data in dataframe
# soort SQLwhere clause
df[df.temperature>=32]
# geef regel met max temperatur
df[df.temperature==df['temperature'].max()]
# geef alleen regels waar een kolomwaarde NIET in een lijst is
df_debet_tmp=df_debet[~df_debet.ID_FACTUURREGEL.isin(lst_debet_found)]
# geef alleen bepaalde columns in het resultaat
df['day'].[df.temperature==df['temperature'].max()]
a= df_credit[df_credit['C_FACTUUR']=='22501-05-1731-05-17JH04Jgd-Verblijf jeu']
Maak een subset
#geef columns van dataframeorders.columns
#maak een subset
orders_subset = Dataframe(orders, columns=['Row id', Order Id],
orders_subset.head()
Indexes
elke dataframe heeft een INTEGER index die loopt van 0 tm mx (bijv 5)bij df.index krijg je dan te zien start=0 en stop =6 < dus 1 lager dan de werkelijke 5
standaard zijn de indexen getallen van 0 tm 5 maar je kan de index ook veranderen. bijv naar dag
df.set_index(['day'] it returns a new dataframe als je wilt dat deze df zelf veranderd dan
df.set_index(['day', inplace=True
dan is het mogelijk
df.loc['1/4/2017']
df.reset_index(inplace=true)
Als index meerdere gelijke waarden bevat, dan toon hij deze bij selectie met loc
Group by (split apply combine)
# groeperen op cityg=df.groupby('city')
g is ad dataframegroupby objects. er worden 3 groupen gecreerd
index newyork bevat dataframe
index paris bevat dataframe
for city, city_df in g:
print(city)
print(city_df)
# benaderen spefiek dataframe
g.get_group('Paris') geeft dataframe met group
# geef per city de max values
g.max()
# split / apply/combine
split: in datagroupen per city
apply: som operations op alle groupen
combine: combine result in datafaframe
# Inline printen
%matplotlib inline
g.plot
Concatenate
je kan 2 of meerdere dataframes concateneren tot 1 dataframedf = pd.concat([india_weather],[us_weather])
de indexen worden dan overgenomen van de bestaande dataframes. Dus dan heb je 2x zelfde getallen. Wil je een nieuwe nummering van de indexen dan moet je
df = pd.concat([india_weather],[us_weather], ignore_index=True)
# additonal Index
df = pd.concat([india_weather],[us_weather],keys=["india","us" )
hij maakt nu een extra index aan india en us
df.loc["us"]
AXIS
standaard is bij de conatenate de axis is 0 (append as row_. Dat betekent dat de rijen van het ene dataframe geplakt worden bij het andere dataframe. handig als je 2 dataframes van verschillende steden met zelfde kenmerken onder elkaar wil plakken. maar als je 2 dataframes van de zelfde steden heb met verschillende kenmerken. Wil je ze niet onder elkaar maar dan wil je de kenmerken op 1 regel. Dit doe je door de AXIS op 1 te zetten.(Append as column)
df.concate([temp_df],[wind_df],axis=1)
er wordt gematched bij rowindex
wat gebeurt als order
Voorbeeld
df_credit_small =pd.DataFrame(df_credit['ID_FACTUURREGEL'])
# er wordt automatisch een Serieobject gemaakt bij 1 columnnaam door Python, daarom weer een dataframe van maken
df_lst_debet_found=pd.DataFrame(lst_debet_found,columns=['ID_FACTUURREGEL'])
df_credits_debets=pd.concat([df_credit_small,df_lst_debet_found] ,ignore_index=True)
#df_credits_debets=df_credit_small.append(pd.DataFrame(lst_debet_found,columns=['ID_FACTUURREGEL']),ignore_index=True)
creddeblist=df_credits_debets['ID_FACTUURREGEL'].tolist()
Merge
Gelijk aan SQL JOIN. dataframes kan je ook mergen. dan worden de column geappend en dit gebeurt op basis van de ON veldendf3=pd.merge(df1,df2, on="city")
Werkt als een INNER JOIN default
een OUTER join doe je via
df3=pd.merge(df1,df2, on="city", how="outer")
LEFT outer : how = "left"
indicator="true" : geeft aan waar de join vandaan komt
suffixes=('_left', '_right')
Pivot
pivot allows you to transform or reshape datamaak een nieuwe shape , wat wil je op je x-as als index en wat wil je als column
df.pivot(index='"data",columns="city")
df.pivot(index='"data",columns="city", values="humidity") geef alleen humidity
Pivot table
pivot table is used to summarize and aggregate data inside a dataframedf.pivot_table(index="city",columns="date", aggfunc="sum")
df.pivot_table(index=pd.grouper(freq='M', key='date'),columns='city') via frequentie wordt er een maand van de index gemaakt
Handling missing data(Nan)
https://www.youtube.com/watch?v=EaGbS7eWSs0als je datumvelden inleest in panda krijgen ze allemaal een string value. Als je dit wil veranderen dan inlezen met parse_dates
df=pd.read_csv("" weather_data.csv",parse_dates=["day"]
#zet day als index in de dataframe
df.set_index('day', inplace=True)
# interpolate to make a guess on missing values using interpolation
Replace all Nan values with a gues vallue
new_dfdf.fillna(0)
#different values for different columns, then use dictionary instead of value
new_df=df.fillna({ 'temperature':0,'windspeed':0,'event': 'no-event'})
#geef missing value de waarde van vorige
new_df=df.fillna(method="ffill")
# backward fill
new_df=df.fillna(method="bfill")
# Coping rows horizontally.
new_df=df.fillna(method="bfill", axis="columns")
Maar 1 x kopieren van waarde
new_df=df.fillna(method="ffill",limit=1)
How to make better guess with interpolate instead with fill
new_df=df.interpolate()new_df=df.interpolate(method="time")
drop rows with missing values
df.dropna()
df.dropna(how="all")
als je 2 valid values hebt dan niet droppen
df.dropna(thres=2)
Vul datum index aan en reindex
dt=pd.date_range("01-01-2017","01-11-2017")
idx =pd.DatetimeIndex(dt)
df=df.reindex(idx)
Iteratie dataframe
for index, row in df.iterrows():
....: print row['c1'], row['c2']
let op. als je alleen index of row doet krijg je andere dataypes
met index,row
for index,row in df.iterrows():
print(type(index))
print(type(row))
<class 'numpy.int64'>
<class 'pandas.core.series.Series'>
<class 'numpy.int64'>
<class 'pandas.core.series.Series'>
met alleen row of alleen index
for row in df.iterrows():
print(type(row))
<class 'tuple'>
<class 'tuple'>
for index in df.iterrows():
print(type(index))
<class 'tuple'>
<class 'tuple'>
Dus als je per rij van een PANDAS dataframe de values wil doorlopen gebruik dan de volgende constructie
szsql="insert into TESTFACTUUR VALUES ("
values=""
methode1
for index,row in df.iterrows():
for myrow in row:
values= values + "'" + str(myrow) + "'"
methode 2
for index,row in df.iterrows():
for t1 in df.iloc[index]:
values= values + "'" + str(t1) + "'"
Uitleg Dataframe en indexen
IndexVerwarring benaderen
df.ozone of
df ['Ozone']
standaard altijd index beginnend bij 0 maar je kan ook zefl een index maken. bijv index month
Selecteren rij kolom
Voor het selecteren van een rij kan je iloc of loc gebruikendf ['Ozone'].iloc[2] : los van de index pak de zoveelste rij
df ['Ozone'].loc["Pietj"] : zoek deze waarde op in index
voor het selecteren van een kolom kan je gewoon de kolomnaam pakken
print(df["Fourth"])
selecteren specifiek veld
Let’s say you have a DataFrame like this one A B C
0 1 2 3
1 4 5 6
2 7 8 9
And you want to access the value that is at index 0, in column ‘A’.Well, here are the various options that exist to get your value
1
back:# Using `iloc[]`
print(df.iloc[0][0])
# Using `loc[]`
print(df.loc[0]['A'])
# Using `at[]`
print(df.at[0,'A'])
# Using `iat[]`
print(df.iat[0,0])
# Using `get_value(index, column)`
print(df.get_value(0, 'A'))
Kolommen zoeken met hoogste waarde
df.loc[df.values.argmax(axis=0)]
joinen van dataframes
allerlei opties kan je meegeven bijv type join etc. Doe Shift + TAB voor uitleg in IPython. er zijn 2 methods om te joinenvia JOIN : dan moet je bij een dataframe specifieke indexkolomen opgeven
df1 = pd.DataFrame({
'col1': [1,2,3,4,5,6],
'cat': ['a','b','c','d','e','f']
}).set_index('cat')
df2 = pd.DataFrame({
'col2': [7,8,9,10,11,12],
'cat': ['a','b','c','d','e','f']
}).set_index('cat')
df1.join(df2)
col1 | col2 | |
---|---|---|
cat | ||
a | 1 | 7 |
b | 2 | 8 |
c | 3 | 9 |
d | 4 | 10 |
e | 5 | 11 |
f | 6 | 12 |
via MERGE
df1 = pd.DataFrame({
'col1': [1,2,3,4,5,6],
'cat': ['a','b','c','d','e','f']
})
df2 = pd.DataFrame({
'col2': [7,8,9,10,11,12],
'cat2': ['a','b','c','d','e','f']
})
via merge .
df1.merge(df2, left_on='cat', right_on='cat2')
Extraaatjesaanmaken Dataframe
df1 = pd.DataFrame({
'col1': [1,2,3,4,5,6],
'cat': ['a','b','c','d','e','f']
})
mapping_dict={1:2,3:2,np.nan:0)
of df2['col3']=df2.col1.map(mappng_dict)
Geen opmerkingen:
Een reactie posten