如何为Pandas数据框中State列的每个值生成带Y/N的新列?
解决方案:Pandas将State列转换为多列Y/N归属标记
Hey there! 针对你这个需要把大量State取值转成对应Y/N标记列的需求,我给你分享两个高效的Python解决方案,不用手动一个个处理,完美适配大规模数据的场景~
先明确下你的需求:
原始数据
| name | state | postcode |
|---|---|---|
| coles | vic | 2501 |
| woolworth | nsw | 3409 |
| big w | act | 3201 |
| target | nt | 1089 |
目标格式
| name | state | postcode | VIC | NSW | ACT | NT |
|---|---|---|---|---|---|---|
| coles | VIC | 2501 | Y | N | N | N |
| woolworth | NSW | 3409 | N | Y | N | N |
| big w | ACT | 3201 | N | N | Y | N |
| target | NT | 1089 | N | N | N | Y |
方法1:用pd.get_dummies一键生成(推荐)
这个方法是Pandas里处理这类问题最简洁高效的方式,自动识别所有State的唯一取值,生成对应的列,完全不用手动循环:
import pandas as pd # 构造原始数据框 df = pd.DataFrame({ 'name': ['coles', 'woolworth', 'big w', 'target'], 'state': ['vic', 'nsw', 'act', 'nt'], 'postcode': [2501, 3409, 3201, 1089] }) # 先把state列统一转成大写,和目标列名匹配 df['state'] = df['state'].str.upper() # 生成哑变量(0/1),然后替换成Y/N state_dummies = pd.get_dummies(df['state'], prefix='', prefix_sep='').replace({0: 'N', 1: 'Y'}) # 把生成的Y/N列和原数据合并 final_df = pd.concat([df, state_dummies], axis=1) print(final_df)
运行后直接得到你要的格式,而且不管State有多少种取值,这个代码都能自动适配,效率比循环高很多~
方法2:循环生成列(贴近Stata思路)
如果你更习惯Stata里循环处理的逻辑,也可以用Python的循环来生成每一列,逻辑更直观:
import pandas as pd df = pd.DataFrame({ 'name': ['coles', 'woolworth', 'big w', 'target'], 'state': ['vic', 'nsw', 'act', 'nt'], 'postcode': [2501, 3409, 3201, 1089] }) # 统一转大写 df['state'] = df['state'].str.upper() # 获取所有唯一的State值 unique_states = df['state'].unique() # 循环遍历每个State,生成对应的Y/N列 for state in unique_states: df[state] = df['state'].apply(lambda x: 'Y' if x == state else 'N') print(df)
这个方法和你在Stata里的循环逻辑几乎一致,每遍历一个State就生成一列,判断当前行是否属于该State,标记Y/N。如果需要对某些列做自定义处理,这个方法更灵活。
小提示
- 如果原始数据的State列大小写混合,一定要先统一转成大写(或小写),确保生成的列名和标记逻辑一致
- 当State取值非常多时,优先用方法1,
pd.get_dummies是基于向量化操作实现的,比循环快很多
内容的提问来源于stack exchange,提问作者Ian_De_Oliveira
相关产品推荐
相关产品推荐

