Pandas多值分类变量如何进行二进制编码?

2024-03-28 10:27:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧,其中某列有多个值:

             my column

         0 - ["A", "B"]
         1 - ["B", "C", "D"]
         2 - ["B", "D"]

如何获得这样的数据帧:(其中每个列都采用“我的列”中的值的名称)

         "A"  "B"  "C"  "D"
      0 - 1    1    0    0
      1 - 0    1    1    1
      2 - 0    1    0    1

Tags: 数据名称mycolumn
3条回答

我认为您需要的是pandas中的get_dummies()函数,您可以在其中找到here的文档

根据文件:

s = pd.Series(list('abca'))
pd.get_dummies(s)

   a  b  c
0  1  0  0
1  0  1  0
2  0  0  1
3  1  0  0

为了好玩,这里有一个傻瓜的天真实现:

import pandas as pd

my_column = pd.Series([['A','B'],['B','C','D'],['B','D']])

frameA = pd.DataFrame(my_column, columns=['my_column'])
#extract all new headers from the DataFrame rows, in order:
headers = sorted(list(set([x for y in frame['my_column'] for x in y])))
#make a list of the DataFrame rows (stored as lists):
rows = [y for x in range(len(frame)) for y in frame.loc[x]]

builder = {}               #construct a dictionary to build a new DataFrame from
for header in headers:
    column = []
    for row in rows:
        if header in row:
            column.append(1)
        else:
            column.append(0)
    builder.update({header:column})

frameB = pd.DataFrame(builder)

print(frameB)

结果:

   A  B  C  D
0  1  1  0  0 
1  0  1  1  1
2  0  1  0  1

如果列中有列表,请将^{}^{}一起使用:

df = df['my column'].str.join('|').str.get_dummies()
print (df)
   A  B  C  D
0  1  1  0  0
1  0  1  1  1
2  0  1  0  1

^{}

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df = pd.DataFrame(mlb.fit_transform(df['my column']),columns=mlb.classes_)
print (df)
   A  B  C  D
0  1  1  0  0
1  0  1  1  1
2  0  1  0  1

如果有字符串,请将^{}str.get_dummies一起使用,如果需要,请从列名中删除"

df = (df['my column'].str.strip('[]')
                     .str.get_dummies(', ')
                     .rename(columns=lambda x: x.strip('"')))
print (df)
   A  B  C  D
0  1  1  0  0
1  0  1  1  1
2  0  1  0  1

相关问题 更多 >