So far we have encountered basic data manipulation with pandas Dataframes including row and column selection, boolean indexing, working with missing values, groupby and aggregate functions such as mean().But there are many other powerful data manipulation and analysis techniques available in pandas. In this lab, we will learn some more advanced ways for data anylsis in Python using Dataframes.
Begin by importing pandas package.
In [1]: import pandas as pd
Next load the dataset that we will be playing arround with.
In [2]: df = pd.read_csv(βhttp://data.cs1656.org/coffee-chain.csvβ) df.head()
Out[2]:Β Β Β Β Area Code MarketΒ Β Β Β Β Β Β Market SizeΒ Β Β Β Β Β Β Product Product Line \ 0Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 985 South Small Market ColombianΒ Β Β Β Β Β Β Β Β Beans 1 985 South Small Market ChamomileΒ Β Β Β Β Β Β Β Β Β Β Leaves
2 985 South Small Market Chamomile Leaves 3 985 South Small Market Decaf Irish Cream Beans
4Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 985 South Small MarketΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β LemonΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Leaves
Product TypeΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β StateΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Type Inventory Budget COGS Budget Margin \
| 0Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Coffee Louisiana Regular | 845 | 50 | 90 |
| 1 Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 540 | 80 | 110 |
| 2 Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 552 | 90 | 120 |
| 3Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Coffee LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 851 | 70 | 90 |
| 4 Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 599 | 60 | 80 |
Budget Profit Budget Sales COGS Margin Marketing Profit Sales \
| 0Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 70 | 140Β Β Β Β Β Β Β Β Β 49 | 71 | 13 | 68 | 128 |
| 1Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 70 | 190Β Β Β Β Β Β Β Β Β 94 | 120 | 31 | 114 | 228 |
| 2Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 80 | 210 101 | 130 | 33 | 126 | 246 |
| 3Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 80 | 160Β Β Β Β Β Β Β Β Β 48 | 70 | 13 | 67 | 126 |
| 4Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 30 | 140Β Β Β Β Β Β Β Β Β 67 | 83 | 25 | 37 | 160 |
Total Expenses
- 25
- 43
- 45
- 25
- 58
Letβs get the subset of the dataframe we need.
In [3]: df_small = df[[βArea Codeβ,βMarketβ, βMarket Sizeβ, βProductβ, βProduct Lineβ, βProduct df_small.head()
Out[3]:Β Β Β Β Area Code MarketΒ Β Β Β Β Β Β Market SizeΒ Β Β Β Β Β Β Product Product Line \ 0Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 985 South Small Market ColombianΒ Β Β Β Β Β Β Β Β Beans 1 985 South Small Market ChamomileΒ Β Β Β Β Β Β Β Β Β Β Leaves
2Β Β Β Β Β Β Β Β Β 985 South Small Market ChamomileΒ Β Β Β Β Β Β Β Leaves 3Β Β Β Β Β Β Β Β Β Β Β Β Β Β 985 South Small Market Decaf Irish CreamΒ Β Β Β Β Β Β Β Beans
4Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 985 South Small MarketΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β LemonΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Leaves
Product TypeΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β StateΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Type Profit Total Expenses
| 0Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Coffee Louisiana Regular | 68 | 25 |
| 1 Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 114 | 43 |
| 2 Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 126 | 45 |
| 3Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Coffee LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 67 | 25 |
| 4 Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 37 | 58 |
1.3Β Β Β Β Β Β Slicing & Indexing
What we saw above was slicing. Slicing uses the [] operator selects a set of rows and/or columns from a DataFrame. Slicing rows
To slice out a set of rows, you use the following syntax: data[start:stop]. When slicing in pandas the start bound is included in the output.
In [4]: df_small[0:3]
Out[4]:Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Area Code MarketΒ Β Β Β Β Β Β Β Β Β Market SizeΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Product Product Line Product Type \
| 0Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 985 South Small Market Colombian | BeansΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Coffee |
| 1Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 985 South Small Market Chamomile | Leaves Herbal Tea |
| 2Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 985 South Small Market Chamomile
StateΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Type Profit Total Expenses 0 Louisiana Regular 68 25 1 Louisiana Decaf 114 43 2 LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β DecafΒ Β Β Β Β Β Β Β Β Β Β Β 126Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 45 |
Leaves Herbal Tea |
Slicing vs Copying
We might have thought that we were creating a fresh copy of df_small when we did slicing. However the statement y = x doesnβt create a copy of our DataFrame. It creates a new variable y that refers to the same object x refers to. This means that there is only one object (the DataFrame), and both x and y refer to it. To create a fresh copy of the DataFrame you can use the syntax y=x.copy(). We will see the effect of slicing but not copying in later steps.
** Indexing **
We can select specific ranges of our data in both the row and column directions using either label or integer-based indexing.
- loc: indexing via labels or integers or mixed
- iloc: indexing via integers only
To select a subset of rows AND columns from our DataFrame, we can use the iloc method. For example,
In [5]: df_small.loc[0:3, βMarketβ: βProductβ]
Out[5]: Market Market Size Product 0 South Small Market Colombian
- South Small Market Chamomile
- South Small Market Chamomile
- South Small Market Decaf Irish Cream In [6]: df_small.iloc[0:4, 1:4]
Out[6]: Market Market Size Product 0 South Small Market Colombian
- South Small Market Chamomile
- South Small Market Chamomile 3 South Small Market Decaf Irish Cream
Notice that indexing in loc is inclusive whereas indexing in iloc is exlusive of the end index
1.4Β Β Β Β Β Statistical Technqiues
1.4.1Β Β Β Β Β Cross-tabulation
Cross tabultaion computes a frequency table of two or more factors. Letβs start by making a crosstab with two variables first.
In [7]: df_crosstab = pd.crosstab(df_small[βMarketβ],df_small[βMarket Sizeβ],margins=True) df_crosstab
Out[7]: Market Size Major Market Small Market All
Market
Central 696 648 1344 East 552 336 888 South 168 504 672 West 288 1056 1344
AllΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 1704Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 2544 4248
Letβc check the type of the cross-tab
In [8]: type(df_crosstab)
Out[8]: pandas.core.frame.DataFrame
Now letβs check the value counts of one of our cross-tabβs dimensions and see if the totals match?
In [9]: pd.value_counts(df_small[βMarket Sizeβ])
Out[9]: Small MarketΒ Β Β Β Β 2544 Major MarketΒ Β Β Β Β Β Β Β Β Β Β Β 1704
Name: Market Size, dtype: int64
Now letβs make a cross-tab with three variables.
In [10]: pd.crosstab(df[βProduct Typeβ], [df[βMarketβ],df[βMarket Sizeβ]],margins=True)
Out[10]: MarketΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β CentralΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β EastΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β South \
Market Size Major Market Small Market Major Market Small Market Major Market Product Type
| CoffeeΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 192Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 192Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 96 | 72 | 48 |
| EspressoΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 144Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 144Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 144 | 96 | 72 |
| Herbal TeaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 192Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 144Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 144 | 72 | 48 |
| TeaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 168Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 168Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 168 | 96 | 0 |
| AllΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 696Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 648Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 552
MarketΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β WestΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β All Market Size Small Market Major Market Small Market Product Type Coffee 144 72 240 1056 Espresso 216 72 288 1176 Herbal Tea 144 72 240 1056 TeaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 0Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 72Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 288 960 AllΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 504Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 288Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 1056 4248 |
336 | 168 |
1.4.2Β Β Β Β Β Β Binning Data
We can bin our data into categorirs by specifying bin widths. Letβs define equal width bins as shown below. The bins array specifies 4 bins from -800 to -400, -400 to 0, 0 to 400, 400 to 800. We will also specify a group names to assign as labels to each of our bins later.
In [11]: bins = [-800,-400, 0, 400, 800] group_names = [βLowβ, βOkayβ, βGoodβ, βGreatβ]
Now lets bin the data into the categories and add it as a column to the dataframe
In [12]: df_small[βCategoriesβ] = pd.cut(df_small[βProfitβ], bins=bins, labels=group_names) df_small.head(20)
Out[12]:Β Β Β Β Β Area Code Market Market SizeΒ Β Β Β Β Β Β Β Β Β Β Β Product Product Line \ 0Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 985 South Small MarketΒ Β Β Β Β Β Β Β Β Β Β Β Β Β ColombianΒ Β Β Β Β Β Β Β Β Beans 1 985 South Small Market ChamomileΒ Β Β Β Β Β Β Β Β Leaves
2Β Β Β Β Β Β 985 South Small Market ChamomileΒ Β Β Β Β Β Β Β Leaves 3Β Β Β Β Β Β Β Β Β Β Β Β Β Β 985 South Small Market Decaf Irish CreamΒ Β Β Β Β Beans 4 985 South Small Market LemonΒ Leaves
- 985 South Small Market Decaf Irish Cream Beans
- 985 South Small Market Lemon Leaves 7Β Β Β Β Β Β Β Β Β Β Β Β Β Β 985 South Small Market ChamomileΒ Β Β Β Β Β Β Β Β Leaves
- 985 South Small Market Caffe Mocha Beans
- 985 South Small Market Caffe Latte Beans 10 985 South Small Market Caffe Latte Beans 11 985 South Small Market Decaf Irish Cream Beans 12 985 South Small Market Decaf Espresso Beans 13 985 South Small Market Lemon Leaves
14 985 South Small Market Decaf Espresso Beans 15 985 South Small Market Lemon Leaves 16 985 South Small Market Caffe Mocha Beans
- 985 South Small Market Caffe Latte Beans
- 985 South Small Market Caffe Mocha Beans
- 985 South Small Market Decaf Espresso Beans
Product TypeΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β StateΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Type Profit Total Expenses Categories
| 0Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Coffee Louisiana Regular | 68 | 25 | Good |
| 1Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 114 | 43 | Good |
| 2Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 126 | 45 | Good |
| 3Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Coffee LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 67 | 25 | Good |
| 4Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 37 | 58 | Good |
| 5Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Coffee LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 87 | 26 | Good |
| 6Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 43 | 58 | Good |
| 7Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 48 | 26 | Good |
| 8Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Espresso Louisiana Regular | 61 | 35 | Good |
| 9Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Espresso Louisiana Regular | 4 | 81 | Good |
| 10Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Espresso Louisiana Regular | 1 | 86 | Good |
| 11Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Coffee LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 70 | 25 | Good |
| 12Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Espresso LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 56 | 39 | Good |
| 13 Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 62 | 65 | Good |
| 14Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Espresso LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 61 | 40 | Good |
| 15 Herbal Tea LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 26 | 59 | Good |
| 16Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Espresso Louisiana Regular | 31 | 35 | Good |
| 17Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Espresso Louisiana Regular | -3 | 79 | Okay |
| 18Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Espresso Louisiana Regular | 58 | 41 | Good |
| 19Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Espresso LouisianaΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Decaf | 31 | 36 | Good |
To find out the value counts for each bin of category, we can use value_counts like we did earlier.
In [13]: pd.value_counts(df_small[βCategoriesβ])
Out[13]: GoodΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 3648
OkayΒ Β Β Β Β Β Β Β Β Β Β Β Β Β 544
GreatΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β 40
LowΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 16
Name: Categories, dtype: int64
1.4.3Β Β Β Β Β Quantiles
Pandas allows an easy way of computing percentiles or quartiles. Letβs first specify the quantiles we want to calculate,
In [14]: quants = [0.0, 0.05, 0.25, 0.5, 0.75, 0.95, 1.0]
To compute the quantiles of Profit and Total Expenses,
In [15]: q = df_small[[βProfitβ,βTotal Expensesβ]].quantile(quants) q
Out[15]:Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Profit Total Expenses
| 0.00 -638.0 | 10.0 |
| 0.05 -13.0 | 17.0 |
| 0.25Β Β Β Β Β Β Β Β Β Β Β 17.0 | 33.0 |
| 0.50Β Β Β Β Β Β Β Β Β Β Β 40.0 | 46.0 |
| 0.75Β Β Β Β Β Β Β Β Β Β Β 92.0 | 65.0 |
| 0.95 232.0 | 125.0 |
| 1.00 778.0 | 190.0 |
1.4.4Β Β Β Β Β Β Β Groupby & Apply
Groupby allows grouping or clustering the dataframe by a particular categorical attribute. Apply can be used to apply a function to a group or the entire dataframe. Letβs first define the function that we want to apply,
In [16]: def get_stats(group): return {βminβ: group.min(), βmaxβ: group.max(), βcountβ: group.count(), βmeanβ: gro
This can be applied to a Dataframe or a grouping of the dataframe as shown below
In [17]: df_group = df_small[βProfitβ].groupby(df_small[βCategoriesβ]).apply(get_stats) df_group
| Out[17]: Categories | Β | Β |
| Low | count | 16.000000 |
| Β | max | -404.000000 |
| Β | mean | -510.562500 |
| Β | min | -638.000000 |
| Β | sum | -8169.000000 |
| Okay | count | 544.000000 |
| Β | max | 0.000000 |
| Β | mean | -45.630515 |
| Β | min | -392.000000 |
| Β | sum | -24823.000000 |
| Good | count | 3648.000000 |
| Β | max | 397.000000 |
| Β | mean | 74.514529 |
| Β | min | 1.000000 |
sumΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β 271829.000000
Great count 40.000000 max 778.000000 mean 517.650000 min 402.000000 sum 20706.000000
Name: Profit, dtype: float64
The width format of the output above can be fixed by using the unstack() function as shown below.
In [18]: df_group.unstack()
Out[18]:Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β countΒ Β Β Β Β Β Β Β Β maxΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β meanΒ Β Β Β Β Β Β Β minΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β sum
Categories
Low 16.0 -404.0 -510.562500 -638.0 -8169.0 OkayΒ Β Β Β Β 544.0Β Β Β Β 0.0 -45.630515 -392.0 -24823.0 GoodΒ Β Β Β Β Β 3648.0 397.0 74.514529Β Β Β Β Β Β Β Β 1.0 271829.0
GreatΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 40.0 778.0 517.650000 402.0Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 20706.0
1.4.5Β Β Β Β Β Sorting
Pandas allows nested sorting over mutliple columns of the Dataframe easily as shown below.
In [19]: data_sorted = df_small.sort_values([βTotal Expensesβ, βProfitβ], ascending=False) data_sorted[[βTotal Expensesβ,βProfitβ]].head(20)
Out[19]:Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Total Expenses Profit
| 959 | 190 | 49 |
| 2334 | 189 | 50 |
| 2352 | 189 | -284 |
| 3432 | 181 | -266 |
| 966 | 180 | 45 |
| 2224 | 180 | 45 |
| 632 | 178 | 370 |
| 1429 | 178 | 370 |
| 631 | 178 | 368 |
| 1605 | 178 | 368 |
| 753 | 177 | 357 |
| 1622 | 177 | 357 |
| 1454 | 177 | 68 |
| 285 | 176 | 69 |
| 4086 | 176 | -392 |
| 3420 | 168 | -367 |
| 1461 | 167 | 62 |
| 3278 | 167 | 62 |
| 1269 | 166 | 511 |
| 1596 | 166 | 511 |
1.5Β Β Β Β Tasks
For your tasks, use the data file http://data.cs1656.org/bank-data.csv.
Task 1 Compute the mean income of males versus females.
Task 2 Create a cross-tab of save_acct and mortgage.
Task 3 Convert the frequencies in cross-tab to percentages. (Hint: use apply and indexing)



