如何将Pandas DataFrame转换为1NF以减少列中唯一值数量?
处理多列逗号分隔多值问题,解决可视化困境
方法1:拆分多值列为单独行,统计频次
把逗号分隔的多个值拆分成单独的行,让每个类型独立出现,再统计每个类型的出现次数,就能直观用于可视化(比如柱状图)。
用Pandas的str.split()和explode()实现:
import pandas as pd # 假设你的数据集存储在df中 df['restaurant_type'] = df['restaurant_type'].str.split(', ') # 按逗号加空格拆分 df_exploded = df.explode('restaurant_type') # 把拆分后的列表展开成多行 # 统计每个餐厅类型的出现次数 type_frequency = df_exploded['restaurant_type'].value_counts() # 直接可视化(以柱状图为例) type_frequency.plot(kind='bar', figsize=(12, 6), title='餐厅类型分布')
如果有多列都需要处理,可批量循环操作:
# 列出所有需要处理的多值列 target_columns = ['restaurant_type', 'cuisine_type', 'service_type'] for col in target_columns: # 拆分并展开列 df[col] = df[col].str.split(', ') exploded_df = df.explode(col) # 统计频次并可视化 col_frequency = exploded_df[col].value_counts() col_frequency.plot(kind='barh', title=f'{col} 分布')
方法2:One-Hot编码,生成类型二进制列
把每个独立类型转为单独的列,值为1(包含该类型)或0(不包含),适合展示多类型共存的分布,或者用于后续分析建模。
实现代码:
# 对restaurant_type列生成one-hot编码 type_onehot = df['restaurant_type'].str.get_dummies(', ') # 合并编码列到原数据集 df_encoded = pd.concat([df, type_onehot], axis=1) # 统计每个类型的总出现次数 type_total = type_onehot.sum() # 可视化(横向柱状图更适合多类型展示) type_total.plot(kind='barh', figsize=(10, 8), title='各餐厅类型总出现次数')
这两种方法都能将原本87个复合值拆解为单个独立类型,大幅降低可视化的复杂度,让你清晰展示各类别的分布情况。
内容的提问来源于stack exchange,提问作者Aman Rao
相关产品推荐
相关产品推荐

