Python 3.x 数据帧转换

Python 3.x 数据帧转换,python-3.x,dataframe,Python 3.x,Dataframe,我正在尝试将数据帧转换为1,0矩阵格式 data = pd.DataFrame({'Val1':['A','B','B'], 'Val2':['C','A','D'], 'Val3':['E','F','C'], 'Comb':['Comb1','Comb2','Comb3']}) data: Val1 Val2 Val3 Comb 0 A C E

我正在尝试将数据帧转换为1,0矩阵格式

data = pd.DataFrame({'Val1':['A','B','B'],
                    'Val2':['C','A','D'],
                    'Val3':['E','F','C'],
                    'Comb':['Comb1','Comb2','Comb3']})
data:
  Val1 Val2 Val3   Comb
0    A    C    E  Comb1
1    B    A    F  Comb2
2    B    D    C  Comb3
我需要的是转换到下面的数据帧

    Comb    A   C   D   E   B   F
0   Comb1   1   1   0   1   0   0
1   Comb2   1   0   0   0   1   1
2   Comb3   0   1   1   0   1   0
我可以用FOR循环来完成,但是随着数据帧的增加,处理时间也会增加。有更好的方法吗

header = set(data[['Val1','Val2','Val3']].values.ravel())
matrix = pd.DataFrame(columns=header)

for i in range(data.shape[0]):
    temp_dict = {data["Val1"].iloc[i]:1, data["Val2"].iloc[i]:1, data["Val3"].iloc[i]:1}
    matrix = matrix.append(temp_dict, ignore_index=True)
                    
matrix = matrix.loc[:, matrix.columns.notnull()]
matrix = matrix.fillna(0)
matrix = pd.merge(data[["Comb"]],matrix, left_index=True, right_index=True, how= 'outer')

谢谢

可能有更好的解决方案,但我想到的是:将每个原始字母转换为当前字母的字典,从字典中构建一个系列,然后将系列组合成一个数据帧

data.loc[:, 'Val1':'Val3'].apply(lambda row: 
         pd.Series({letter: 1 for letter in row}), axis=1)\
    .fillna(0).astype(int).join(data.Comb)    
#   A  B  C  D  E  F   Comb
#0  1  0  1  0  1  0  Comb1
#1  1  1  0  0  0  1  Comb2
#2  0  1  1  1  0  0  Comb3

也许有更好的解决方案,但我想到的是:将每个原始字母转换为当前字母的字典,从字典中构建一个系列,并将系列组合成一个数据帧

data.loc[:, 'Val1':'Val3'].apply(lambda row: 
         pd.Series({letter: 1 for letter in row}), axis=1)\
    .fillna(0).astype(int).join(data.Comb)    
#   A  B  C  D  E  F   Comb
#0  1  0  1  0  1  0  Comb1
#1  1  1  0  0  0  1  Comb2
#2  0  1  1  1  0  0  Comb3

可能有多种方法可以解决这个问题,我使用了pd.crosstab:


可能有多种方法可以解决这个问题,我使用了pd.crosstab:


我想这会管用的。请让我知道它是否有效

 pd.get_dummies(data, columns=['Val1','Val2','Val3'],prefix="",prefix_sep="").groupby(axis=1,level=0).sum()

我想这会管用的。请让我知道它是否有效

 pd.get_dummies(data, columns=['Val1','Val2','Val3'],prefix="",prefix_sep="").groupby(axis=1,level=0).sum()
还有一种方法:

data.melt('Comb').set_index('Comb')['value'].str.get_dummies().sum(level=0).reset_index()
输出:

    Comb  A  B  C  D  E  F
0  Comb1  1  0  1  0  1  0
1  Comb2  1  1  0  0  0  1
2  Comb3  0  1  1  1  0  0
还有一种方法:

data.melt('Comb').set_index('Comb')['value'].str.get_dummies().sum(level=0).reset_index()
输出:

    Comb  A  B  C  D  E  F
0  Comb1  1  0  1  0  1  0
1  Comb2  1  1  0  0  0  1
2  Comb3  0  1  1  1  0  0

每行中是否可能有一个以上的字母实例?没有一个字母在一行中只出现一次。每行中是否可能有一个以上的字母实例?没有一个字母在一行中只出现一次。安德烈亚斯,你能告诉我你改变了什么吗。。。我没有任何困难。安德烈亚斯,你能告诉我你改变了什么吗。。。我没有任何区别