我在Pandas数据框中有一个名为“label”的变量,它包含多个字符串值(例如:'label1', "label2', 'label3'...
)。
label
label1
label1
label23
label3
label11
我将所有唯一值输出到列表中,然后创建新变量
unique_labels = df['label'].unique()
for i in unique_labels: # create new single label variable holders
df[str(i)] = 0
现在我有了
label label1 label2 .... label23
label1 0 0 0
label23 0 0 0
我想将基于'label'
的相应值分配到新的单个标签变量上,如下所示
label label1 label2 .... label23
label1 1 0 0
label23 0 0 1
这是我的代码
def single_label(df):
for i in range(len(unique_labels)):
if df['label'] == str(unique_labels[i]):
df[unique_labels[i]] == 1
df = df.applymap(single_label)
获取此错误
TypeError: ("'int' object is not subscriptable", 'occurred at index Unnamed: 0')
答案 0 :(得分:2)
IIUC,您可以在删除重复项之后使用pd.get_dummies
,这样可以更快地执行代码,而不是迭代执行代码:
df.drop_duplicates().join(pd.get_dummies(df.drop_duplicates()))
label label_label1 label_label11 label_label23 label_label3
0 label1 1 0 0 0
2 label23 0 0 1 0
3 label3 0 0 0 1
4 label11 0 1 0 0
您可以使用label
和prefix
参数删除那些prefix_sep
前缀和下划线:
df.drop_duplicates().join(pd.get_dummies(df.drop_duplicates(),
prefix='', prefix_sep=''))
label label1 label11 label23 label3
0 label1 1 0 0 0
2 label23 0 0 1 0
3 label3 0 0 0 1
4 label11 0 1 0 0
编辑:使用第二列,即:
>>> df
label second_column
0 label1 a
1 label1 b
2 label23 c
3 label3 d
4 label11 e
只需在标签栏上调用pd.get_dummies
:
df.drop_duplicates('label').join(pd.get_dummies(df['label'].drop_duplicates(),
prefix='', prefix_sep=''))
label second_column label1 label11 label23 label3
0 label1 a 1 0 0 0
2 label23 c 0 0 1 0
3 label3 d 0 0 0 1
4 label11 e 0 1 0 0
然而,你没有重复删除行,我不认为你想要的是什么(除非我弄错了)。如果没有,只需省略drop duplicates calls:
df.join(pd.get_dummies(df['label'], prefix='', prefix_sep=''))
label second_column label1 label11 label23 label3
0 label1 a 1 0 0 0
1 label1 b 1 0 0 0
2 label23 c 0 0 1 0
3 label3 d 0 0 0 1
4 label11 e 0 1 0 0