[SOLVED] CS1656 Lab4-Data Analysis with Pandas

35.00 $

Category:
Click Category Button to View Your Next Assignment | Homework

You will receive the following solution file(s) instantly after successful payment:

zip file icon Lab4-yahaxt.zip (92.5 KB)
Assignment Instructions Updated Recently? Submit Below and we will provide new Solution!
Submit New Instructions
πŸ”’ Securely Powered by:
Secure Checkout
Rate this product

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)

  • Lab4-yahaxt.zip