虚拟代码具有相同名称的多个列,包括数据中不存在的类别
dummy code multiple columns with same name, including categories not present in data
附加问题
这些列需要使用具有以下格式的字典将实际问题附加到每个列名称的开头。它需要以矢量化的方式访问,因为其中有很多 columns/lists.
词典
dic = dict({'ab': 'what colour is this?',
'cd': 'what size is this?',
'ef': 'who do you live with?'})
代码
dout=[]
for c in df.columns[1:].unique(): #here unique
b = (pd.get_dummies(df[c], prefix='', prefix_sep='')
.sum(axis=1, level=0) #here equivalent to groupby.sum
.reindex(columns = all_categories[c], fill_value=0))
b.columns = [c + ' ' + str(col) for col in b.columns]
for key, value in dic.items():
b.columns = [col.replace(c, value) for col in b.columns]
dout.append(b)
由于@ben.T
,以下部分已解决
我有一个数据框,我想用虚拟代码 - 有多个同名的列,我还想在虚拟编码数据框中包含所有可能的类别,这些类别不一定存在于实际数据中框架本身。
我可以让它正常工作,直到我尝试合并不存在的答案中的列 - 我一直收到错误 ValueError: cannot reindex from a duplicate axis
下面是一些类似的数据,我的小代码也是如此(a 有效,b 无效)
非常感谢!
create some data
all_categories = {'ab': ['green', 'red', 'blue', 'pink', 'None',
'orange', 'purple, white'],
'cd': ['XS', 'M', 'L', 'XL'],
'ef': ['husband', 'wife', 'son', 'daughter',
'grandparent', 'aunt', 'uncle','None'] }
data = {'ab': ['green', 'red', 'blue', 'None'],
'ab1': ['red', 'yellow', 'None', 'None'],
'cd': ['L', 'XL', 'M','L'],
'ef':['husband', 'wife', 'husband', 'None'],
'ef1':['son', 'grandparent', 'son', 'None'],
'ef2':['None', 'son', 'None', 'None'] }
df = pd.DataFrame(data, columns = ['ab', 'ab1', 'cd', 'ef', 'ef1', 'ef2'])
df = df.rename(columns={'ab1':'ab', 'ef1':'ef', 'ef2':'ef'})
command
dout=[]
for c in df.columns[1:]:
a = pd.concat([df['id'], pd.get_dummies(df[c], prefix='', prefix_sep='')],axis=1) ### this works
b = pd.get_dummies(df[c], prefix='', prefix_sep='').reindex(columns = all_categories, fill_value=0) ### this does not work
dout.append(b)
两件事,因为你有重复的列名,你可以遍历 unique
列名。对于reindex
的问题,可以先用sum
along columns (axis=1) 然后用level=0 groupby similar columns name.
dout=[]
for c in df.columns[1:].unique(): #here unique
b = (pd.get_dummies(df[c], prefix='', prefix_sep='')
.sum(axis=1, level=0) #here equivalent to groupby.sum
.reindex(columns = all_categories[c], fill_value=0)
)
dout.append(b)
附加问题
这些列需要使用具有以下格式的字典将实际问题附加到每个列名称的开头。它需要以矢量化的方式访问,因为其中有很多 columns/lists.
词典
dic = dict({'ab': 'what colour is this?',
'cd': 'what size is this?',
'ef': 'who do you live with?'})
代码
dout=[]
for c in df.columns[1:].unique(): #here unique
b = (pd.get_dummies(df[c], prefix='', prefix_sep='')
.sum(axis=1, level=0) #here equivalent to groupby.sum
.reindex(columns = all_categories[c], fill_value=0))
b.columns = [c + ' ' + str(col) for col in b.columns]
for key, value in dic.items():
b.columns = [col.replace(c, value) for col in b.columns]
dout.append(b)
由于@ben.T
,以下部分已解决我有一个数据框,我想用虚拟代码 - 有多个同名的列,我还想在虚拟编码数据框中包含所有可能的类别,这些类别不一定存在于实际数据中框架本身。
我可以让它正常工作,直到我尝试合并不存在的答案中的列 - 我一直收到错误 ValueError: cannot reindex from a duplicate axis
下面是一些类似的数据,我的小代码也是如此(a 有效,b 无效)
非常感谢!
create some data
all_categories = {'ab': ['green', 'red', 'blue', 'pink', 'None',
'orange', 'purple, white'],
'cd': ['XS', 'M', 'L', 'XL'],
'ef': ['husband', 'wife', 'son', 'daughter',
'grandparent', 'aunt', 'uncle','None'] }
data = {'ab': ['green', 'red', 'blue', 'None'],
'ab1': ['red', 'yellow', 'None', 'None'],
'cd': ['L', 'XL', 'M','L'],
'ef':['husband', 'wife', 'husband', 'None'],
'ef1':['son', 'grandparent', 'son', 'None'],
'ef2':['None', 'son', 'None', 'None'] }
df = pd.DataFrame(data, columns = ['ab', 'ab1', 'cd', 'ef', 'ef1', 'ef2'])
df = df.rename(columns={'ab1':'ab', 'ef1':'ef', 'ef2':'ef'})
command
dout=[]
for c in df.columns[1:]:
a = pd.concat([df['id'], pd.get_dummies(df[c], prefix='', prefix_sep='')],axis=1) ### this works
b = pd.get_dummies(df[c], prefix='', prefix_sep='').reindex(columns = all_categories, fill_value=0) ### this does not work
dout.append(b)
两件事,因为你有重复的列名,你可以遍历 unique
列名。对于reindex
的问题,可以先用sum
along columns (axis=1) 然后用level=0 groupby similar columns name.
dout=[]
for c in df.columns[1:].unique(): #here unique
b = (pd.get_dummies(df[c], prefix='', prefix_sep='')
.sum(axis=1, level=0) #here equivalent to groupby.sum
.reindex(columns = all_categories[c], fill_value=0)
)
dout.append(b)