Selecting rows (loc, iloc) in Data Analysis Python - Time & Space Complexity
When we select rows from a table, we want to know how long it takes as the table grows.
How does the time to pick rows change when the data gets bigger?
Analyze the time complexity of the following code snippet.
import pandas as pd
data = pd.DataFrame({
'A': range(1000),
'B': range(1000, 2000)
})
selected_rows = data.loc[100:199]
This code selects rows from index 100 to 199 using loc.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Accessing each row in the selected range.
- How many times: Once for each row in the slice (here, 100 times).
When you select more rows, the time grows roughly with how many rows you pick.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 row accesses |
| 100 | About 100 row accesses |
| 1000 | About 1000 row accesses |
Pattern observation: The time grows linearly with the number of rows selected.
Time Complexity: O(k)
This means the time grows directly with the number of rows you select, not the total table size.
[X] Wrong: "Selecting rows always takes time proportional to the whole table size."
[OK] Correct: Actually, selecting a slice accesses only the rows you want, so time depends on how many rows you pick, not the entire table.
Understanding how data selection scales helps you write efficient code and explain your choices clearly in real projects.
What if we select rows using a condition instead of a slice? How would the time complexity change?
Practice
loc and iloc in pandas?Solution
Step 1: Understand
locusagelocselects rows using the row labels or names, not their numeric position.Step 2: Understand
ilocusageilocselects rows based on their integer position, starting at zero.Final Answer:
locselects rows by label,ilocselects rows by position. -> Option AQuick Check:
loc= label,iloc= position [OK]
- Confusing label with position
- Using iloc with labels
- Assuming loc uses integer positions
df using loc?Solution
Step 1: Identify correct method for label selection
To select by label, uselocwith the label as a string if it is a string label.Step 2: Check syntax for string label
The label '2023-01-01' must be in quotes insidelocbrackets.Final Answer:
df.loc['2023-01-01'] -> Option DQuick Check:
Use quotes for string labels with loc [OK]
- Omitting quotes around string labels
- Using iloc with labels
- Using loc without brackets
df below:import pandas as pd
data = {'Name': ['Anna', 'Bob', 'Cara', 'Dave'], 'Age': [23, 35, 45, 29]}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])What is the output of
df.loc['b']?Solution
Step 1: Understand DataFrame index labels
The DataFrame has index labels 'a', 'b', 'c', 'd'. The row with label 'b' corresponds to Bob, age 35.Step 2: Use
locto select row by labeldf.loc['b']returns the row with label 'b' as a Series with Name and Age values.Final Answer:
Name Bob Age 35 Name: b, dtype: object -> Option CQuick Check:
loc selects row 'b' with Bob's data [OK]
- Using iloc instead of loc
- Confusing label 'b' with position 1
- Expecting a DataFrame instead of Series
import pandas as pd
data = {'Value': [10, 20, 30]}
df = pd.DataFrame(data, index=[1, 2, 3])
row = df.loc[2]What is wrong with this code if the intention was to select the second row by position?
Solution
Step 1: Check DataFrame index labels
The DataFrame index labels are [1, 2, 3]. Usingloc[2]selects the row with label 2, not the second row by position.Step 2: Understand difference between label and position
The second row by position is at index 1 (zero-based), soiloc[1]should be used to select by position.Final Answer:
It selects the row with label 2, not the second row by position. -> Option AQuick Check:
loc uses labels, iloc uses positions [OK]
- Using loc to select by position
- Confusing index labels with positions
- Expecting loc to be zero-based
df with a non-numeric index: import pandas as pd
data = {'Score': [88, 92, 95, 70]}
labels = ['a', 'b', 'c', 'd']
df = pd.DataFrame(data, index=labels)How would you select the first two rows by position and the rows labeled 'b' and 'c' by label, then combine these selections into one DataFrame?
Solution
Step 1: Select first two rows by position
Usedf.iloc[:2]to select rows at positions 0 and 1.Step 2: Select rows labeled 'b' and 'c'
Usedf.loc[['b', 'c']]to select rows by their labels.Step 3: Combine selections into one DataFrame
Usepd.concatto join the two selections vertically.Final Answer:
pd.concat([df.iloc[:2], df.loc[['b', 'c']]]) -> Option BQuick Check:
Combine iloc and loc selections with concat [OK]
- Trying to add DataFrames with + operator
- Mixing labels and positions incorrectly
- Using loc with positions or iloc with labels
Ready to prove it?
Pass the test and this pattern moves unknown
