Pandas - str.len() - Get Length of String

• The `str.len()` method returns the character count for each string element in a Pandas Series, handling NaN values by returning NaN rather than raising errors

Key Insights

• The str.len() method returns the character count for each string element in a Pandas Series, handling NaN values by returning NaN rather than raising errors • String length operations work exclusively through the .str accessor and cannot be applied directly using Python’s built-in len() function on Series objects • Performance optimization matters when working with large datasets—vectorized str.len() operations outperform iterative approaches by orders of magnitude

Basic String Length Operations

The str.len() method computes the character length of each string in a Pandas Series. Unlike Python’s built-in len() function, which returns the number of elements in a Series, str.len() operates on individual string values.

import pandas as pd

# Create a Series with string data
data = pd.Series(['apple', 'banana', 'cherry', 'date'])
lengths = data.str.len()

print(lengths)
# Output:
# 0    5
# 1    6
# 2    6
# 3    4
# dtype: int64

The method returns an integer Series where each value represents the character count of the corresponding string. This includes all characters—letters, numbers, spaces, and special characters.

# Strings with various characters
mixed_data = pd.Series(['hello world', '123-456-7890', 'user@email.com', 'a b c'])
print(mixed_data.str.len())
# Output:
# 0    11
# 1    12
# 2    15
# 3     5
# dtype: int64

Handling Missing Values

One critical advantage of str.len() is its graceful handling of missing data. When encountering NaN values, the method returns NaN instead of throwing errors.

# Series with missing values
data_with_nan = pd.Series(['apple', None, 'cherry', pd.NA, ''])

lengths = data_with_nan.str.len()
print(lengths)
# Output:
# 0    5.0
# 1    NaN
# 2    6.0
# 3    NaN
# 4    0.0
# dtype: float64

Note that empty strings return a length of 0, while None and pd.NA return NaN. The result dtype becomes float64 to accommodate NaN values.

To filter or fill missing length values:

# Fill NaN with a default value
lengths_filled = data_with_nan.str.len().fillna(0)
print(lengths_filled)
# Output:
# 0    5.0
# 1    0.0
# 2    6.0
# 3    0.0
# 4    0.0
# dtype: float64

# Filter out rows with NaN lengths
valid_lengths = data_with_nan[data_with_nan.str.len().notna()]
print(valid_lengths)
# Output:
# 0     apple
# 2    cherry
# 4          
# dtype: object

Working with DataFrames

Apply str.len() to DataFrame columns to analyze string lengths across your dataset. This is particularly useful for data validation and quality checks.

# Create a DataFrame
df = pd.DataFrame({
    'name': ['John Doe', 'Jane Smith', 'Bob Wilson', 'Alice Brown'],
    'email': ['john@example.com', 'jane@test.org', 'bob@email.co', 'alice@domain.net'],
    'phone': ['555-1234', '555-5678', '555-9012', '555-3456']
})

# Add length columns
df['name_length'] = df['name'].str.len()
df['email_length'] = df['email'].str.len()

print(df)
# Output:
#           name              email     phone  name_length  email_length
# 0     John Doe   john@example.com  555-1234            8            16
# 1   Jane Smith     jane@test.org  555-5678           10            13
# 2   Bob Wilson     bob@email.co  555-9012           10            12
# 3  Alice Brown  alice@domain.net  555-3456           11            16

Filtering and Conditional Logic

Use string length calculations to filter data based on character count constraints. This is essential for data validation and cleaning operations.

# Filter products with names longer than 10 characters
products = pd.DataFrame({
    'product_name': ['Laptop', 'Wireless Mouse', 'USB Cable', 'External Hard Drive', 'Keyboard'],
    'price': [999, 25, 10, 150, 75]
})

long_names = products[products['product_name'].str.len() > 10]
print(long_names)
# Output:
#           product_name  price
# 1        Wireless Mouse     25
# 3  External Hard Drive    150

Combine multiple conditions for complex filtering:

# Find products with names between 5 and 15 characters
filtered = products[
    (products['product_name'].str.len() >= 5) & 
    (products['product_name'].str.len() <= 15)
]
print(filtered)
# Output:
#    product_name  price
# 0        Laptop    999
# 1 Wireless Mouse     25
# 2    USB Cable     10
# 4      Keyboard     75

Unicode and Multi-Byte Characters

The str.len() method counts characters, not bytes. This distinction matters when working with Unicode strings containing multi-byte characters.

# Unicode characters
unicode_data = pd.Series(['hello', 'café', '你好', '🎉🎊', 'naïve'])
print(unicode_data.str.len())
# Output:
# 0    5
# 1    4
# 2    2
# 3    2
# 4    5
# dtype: int64

Each emoji counts as one character, and accented characters are counted individually. This behavior differs from byte-level operations.

# Compare with byte length
df = pd.DataFrame({'text': ['hello', 'café', '你好']})
df['char_length'] = df['text'].str.len()
df['byte_length'] = df['text'].str.encode('utf-8').apply(len)

print(df)
# Output:
#    text  char_length  byte_length
# 0  hello            5            5
# 1   café            4            5
# 2     你好            2            6

Performance Considerations

When processing large datasets, str.len() provides significant performance advantages over iterative approaches.

import numpy as np
import time

# Create large dataset
large_series = pd.Series(['sample_text'] * 1000000)

# Vectorized approach
start = time.time()
lengths_vectorized = large_series.str.len()
vectorized_time = time.time() - start

# Iterative approach (avoid this)
start = time.time()
lengths_iterative = large_series.apply(lambda x: len(x) if pd.notna(x) else np.nan)
iterative_time = time.time() - start

print(f"Vectorized: {vectorized_time:.4f}s")
print(f"Iterative: {iterative_time:.4f}s")
print(f"Speedup: {iterative_time/vectorized_time:.2f}x")
# Output (approximate):
# Vectorized: 0.0234s
# Iterative: 0.4521s
# Speedup: 19.32x

Validation and Data Quality

Use str.len() for enforcing data quality rules and identifying anomalies in string data.

# Validate phone numbers (expecting 10 digits with dashes)
contacts = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'phone': ['555-123-4567', '555-5678', '555-901-2345', '555-34-56789']
})

# Expected format: XXX-XXX-XXXX (12 characters)
contacts['valid_phone'] = contacts['phone'].str.len() == 12
contacts['length'] = contacts['phone'].str.len()

print(contacts)
# Output:
#      name         phone  valid_phone  length
# 0   Alice  555-123-4567         True      12
# 1     Bob      555-5678        False       8
# 2 Charlie  555-901-2345         True      12
# 3   David  555-34-56789        False      12

Identify outliers based on statistical measures of string length:

# Find descriptions that are unusually short or long
descriptions = pd.Series([
    'Great product',
    'This is an amazing item that exceeded all my expectations',
    'Good',
    'Excellent quality and fast shipping with great customer service'
])

mean_len = descriptions.str.len().mean()
std_len = descriptions.str.len().std()

outliers = descriptions[
    (descriptions.str.len() < mean_len - 2*std_len) |
    (descriptions.str.len() > mean_len + 2*std_len)
]
print(outliers)
# Output:
# 1    This is an amazing item that exceeded all my...
# 3    Excellent quality and fast shipping with gre...
# dtype: object

The str.len() method provides a robust, efficient way to analyze string lengths in Pandas. Its vectorized implementation, proper NaN handling, and Unicode support make it indispensable for data cleaning, validation, and exploratory analysis workflows.

Liked this? There's more.

Every week: one practical technique, explained simply, with code you can use immediately.