python - Pandas - 带有选定集合的 get_dummies
问题描述
使用以下数据框:
>>> df = pd.DataFrame(data={'category':['a','b','c'],'val':[1,2,3]})
>>> df
category val
0 a 1
1 b 2
2 c 3
我正在连接生成的虚拟列并像这样删除原始列:
>>> df = pd.concat([df, pd.get_dummies(df['category'], prefix='cat')], axis=1).drop(['category'], axis=1)
>>> df
val cat_a cat_b cat_c
0 1 1 0 0
1 2 0 1 0
2 3 0 0 1
然后,我为未来的未知值添加另一列,如下所示:
>>> df['cat_unkown'] = 0
>>> df
val cat_a cat_b cat_c cat_unkown
0 1 1 0 0 0
1 2 0 1 0 0
2 3 0 0 1 0
现在我想在一个新的 DataFrame 上 get_dummies,但是将它映射到可用的列,这意味着:如果存在类别列,则使用它,否则将 cat_unkown 设置为 1
例如对于以下 DataFrame:
category val
0 a 1
1 b 2
2 d 3
结果将是:
val cat_a cat_b cat_c cat_unkonw
0 1 1 0 0 0
1 2 0 1 0 0
2 3 0 0 0 1
什么是有效的方法?
更新:稍微详细说明一下,在我的实际问题中,我有 get_dummies 产生结果后的数据框。
解决方案
我相信你需要:
df = pd.DataFrame(data={'category':['a','b','c'],'val':[1,2,3]})
df = pd.concat([df, pd.get_dummies(df['category'], prefix='cat')], axis=1).drop(['category'], axis=1)
df['cat_unkown'] = 0
print (df)
val cat_a cat_b cat_c cat_unkown
0 1 1 0 0 0
1 2 0 1 0 0
2 3 0 0 1 0
df1 = pd.DataFrame(data={'category':['a','b','d'],'val':[1,2,3]})
df1 = pd.concat([df1, pd.get_dummies(df1['category'], prefix='cat')], axis=1).drop(['category'], axis=1)
print (df1)
val cat_a cat_b cat_d
0 1 1 0 0
1 2 0 1 0
2 3 0 0 1
#get all columns names without val
orig_cols = df.columns.difference(['val'])
print (orig_cols)
Index(['cat_a', 'cat_b', 'cat_c', 'cat_unkown'], dtype='object')
#create dictionary with all columns from df1 which are not in df (also removed vals column)
dif = dict.fromkeys(df1.columns.difference(['val'] + orig_cols.tolist()), 'cat_unkown')
print (dif)
{'cat_d': 'cat_unkown'}
#rename columns and if-else for possible multiplied renamed columns
df3 = (df1.rename(columns=dif)
.assign(cat_unkown = lambda x: x.pop('cat_unkown').max(axis=1)
if isinstance(x['cat_unkown'], pd.DataFrame)
else x.pop('cat_unkown'))
.reindex(columns=orig_cols, fill_value=0)
)
print (df3)
cat_a cat_b cat_c cat_unkown
0 1 0 0 0
1 0 1 0 0
2 0 0 0 1
推荐阅读
- java - 使用 lambda 优化 Stream
- transactions - 如何在超级账本中获取交易历史
- sql - 如何在案例选择查询中选择 LONG 列
- mysqli - 防止 SQL 注入和 XSS
- mysql - 如何为特定的复合键(MyISAM)重置 AUTO_INCREMENT?
- git - 如何从 Github 克隆项目并通过终端将其保存为 VS Code 中的工作区
- css - VS 代码 - 如何自动格式化 CSS?
- hibernate - 验证发送到数据库的数据是否真的来自前端
- python - Python 崩溃 EXC_BAD_ACCESS (SIGSEGV)
- svg - Inkscape:从组中删除变换而不取消分组(保留元素 ID)