Python 3.x 数据帧转换
我正在尝试将数据帧转换为1,0矩阵格式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
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
每行中是否可能有一个以上的字母实例?没有一个字母在一行中只出现一次。每行中是否可能有一个以上的字母实例?没有一个字母在一行中只出现一次。安德烈亚斯,你能告诉我你改变了什么吗。。。我没有任何困难。安德烈亚斯,你能告诉我你改变了什么吗。。。我没有任何区别