The request

From Priya Shah, Head of Data
Your goal
Set result to a DataFrame with the first 10 rows of orders, all columns, exactly as head() returns them.
- Use the
ordersDataFramenot done yet - Show exactly
order_idcustomer_idorder_datestatuschannelshipping_feecoupon_codenot done yet - 10 rows, sorted as askednot done yet
Your code
Loading the editor…
Reference solution
| order_id | customer_id | order_date | status | channel |
|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace |
Mote checks your result
Press Run. Each row that matches the goal becomes a firefly in your lantern.
What Priya gets, and why
DataFrames
Loaded for you as pandas DataFrames, plus pd and np.
orders12,000 rows · 7 columns
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NaN |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NaN |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
customers2,018 rows · 9 columns
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NaN |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NaN |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NaN |
products120 rows · 8 columns
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NaN | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
order_items30,338 rows · 6 columns
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
returns1,673 rows · 5 columns
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 rows · 8 columns
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NaN | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 rows · 7 columns
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NaN | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NaN | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NaN | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NaN | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 rows · 3 columns
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
The lesson
What a DataFrame is
A DataFrame is a table: rows of records, named columns, and a label for every row. If you’ve used a spreadsheet, you already know the shape. The difference is that you work with it in code, so every step is written down, repeatable and fast on millions of rows.
Each column of a DataFrame is a Series: a single column of values with one data type, such as all integers or all text. You’ll meet Series constantly, because selecting one column, adding a column or summarising a column all produce one.
On the left of every DataFrame is the index, the row labels. When a table is loaded from a CSV file, the index is simply 0, 1, 2, and so on. It isn’t one of the columns; it’s the row’s address. You’ll see it change when you filter or sort, which matters later.
Looking at the data
You never print a 12,000-row table to read it. You look at a slice:
orders.head() # first 5 rows
orders.head(10) # first 10 rows
orders.tail(3) # last 3 rows
orders.sample(5, random_state=1) # 5 random rows, the same 5 every time
head shows you how the data starts, which for orders means the oldest records. tail shows the
newest. sample is the best way to see “typical” rows, since the start of a file is often special
(test orders, early data). random_state fixes the randomness so you and a colleague see the same
rows.
These methods return a new DataFrame; they don’t change orders. That’s true of almost every pandas
method: you get a result back, and you store it in a variable if you want to keep it.
Reading the orders table
The first rows of orders look like this:
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code | |
|---|---|---|---|---|---|---|---|
| 0 | 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NaN |
| 1 | 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NaN |
| 2 | 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
A few things to notice straight away:
- Each row is one order, identified by
order_id. Knowing what one row represents (the grain of the table) is the most important fact about any table. customer_idlinks each order to a row incustomers. You’ll join them in chapter 7.coupon_codeshowsNaNwhere no coupon was used.NaN(not a number) is how pandas marks a missing value.order_dateholds a date and a time. It was parsed as a real datetime when the table was loaded, so you can pull out years and months from it. You’ll do that in the cleaning chapter.
Displaying results
In this game, the value in result is what gets checked, and it’s shown as a table under the
editor. In a Jupyter notebook, the last expression in a cell is displayed automatically, so you’ll
often see analysts write just orders.head() on its own line.
Common mistakes
- Writing
orders.headwithout brackets. That’s the method itself, not its result, and pandas shows something like<bound method NDFrame.head ...>. - Treating the index as the order ID. Here they happen to move together, but after a filter or a sort they won’t.
- Assuming the first rows are representative. Always look at a sample too.
If you know SQL
orders.head(10) is like SELECT * FROM orders LIMIT 10, with the difference that a DataFrame
already has a row order, so the “first ten” are well defined.
Lantern lit!
Practised: dataframeseriesindexheadtail
- Solved
- No hints
- First run
