如何以Pythonic方式统计DataFrame每行分类特征的标签出现次数?
Pythonic way to count categorical label occurrences per row in a DataFrame
Here are two efficient, Pythonic approaches to solve your problem:
Approach 1: Using value_counts with apply (concise for unknown labels)
This method automatically detects all unique labels from your data and tallies their occurrences per row:
import pandas as pd qualityOfLife_df = pd.DataFrame( [['A', 'Up', 'Up', 'Same'], ['B', 'Up', 'Down', 'Up'], ['C', 'Down', 'Down', 'Down']], columns=['City', 'Crime', 'Pollution', 'Jobs'] ) # Target columns containing categorical labels cat_columns = ['Crime', 'Pollution', 'Jobs'] # Extract all unique labels across the categorical columns unique_labels = qualityOfLife_df[cat_columns].stack().unique() # Calculate row-wise counts, fill missing labels with 0, and rename columns label_counts = qualityOfLife_df[cat_columns].apply( lambda row: row.value_counts().reindex(unique_labels, fill_value=0), axis=1 ).rename(columns=lambda x: f'n{x}') # Merge counts back to the original DataFrame result = pd.concat([qualityOfLife_df, label_counts], axis=1) print(result)
Approach 2: Using pd.get_dummies (vectorized, better for large datasets)
This vectorized method avoids row-wise loops, making it faster for big datasets:
import pandas as pd qualityOfLife_df = pd.DataFrame( [['A', 'Up', 'Up', 'Same'], ['B', 'Up', 'Down', 'Up'], ['C', 'Down', 'Down', 'Down']], columns=['City', 'Crime', 'Pollution', 'Jobs'] ) # Create dummy variables for all categorical columns (excluding City) dummies = pd.get_dummies(qualityOfLife_df.drop('City', axis=1)) # Sum dummy columns for each label and add to the original DataFrame qualityOfLife_df['nUp'] = dummies.filter(like='_Up').sum(axis=1) qualityOfLife_df['nDown'] = dummies.filter(like='_Down').sum(axis=1) qualityOfLife_df['nSame'] = dummies.filter(like='_Same').sum(axis=1) print(qualityOfLife_df)
Both methods will produce your desired output:
City Crime Pollution Jobs nUp nDown nSame 0 A Up Up Same 2 0 1 1 B Up Down Up 2 1 0 2 C Down Down Down 0 3 0
Key Notes:
- Approach 1 is ideal if you don't know all possible labels upfront—it automatically detects them from your data.
- Approach 2 is more performant for large datasets since it leverages pandas' vectorized operations instead of row-wise processing.
内容的提问来源于stack exchange,提问作者shanlodh
相关产品推荐
相关产品推荐

