我正在尝试从一个exisitng数据帧创建一个具有二进制(0或1)值的新数据帧。对于给定数据帧中的每一行,程序应从每个单元格中获取值,并为新数据帧中用相同编号索引的行的相应列设置1
我尝试执行以下代码段。
for col in products :
index = 0;
for item in products.loc[col] :
products_coded.ix[index, 'prod_' + str(item)] = 1;
index = index + 1;
它适用于较少的行数。但是,任何大型数据集都需要花费大量时间。什么是获得预期结果的最佳方法。
最佳答案
我认为您需要:
第一个get_dummies
,将值强制转换为string
s
通过列名称max
聚集max
为了正确排序将列转换为int
reindex
用于排序和追加缺少的列,用参数NaN
替换0
到fill_value=0
并删除第一列0
add_prefix
用于重命名列
df = pd.DataFrame({'B':[3,1,12,12,8],
'C':[0,6,0,14,0],
'D':[0,14,0,0,0]})
print (df)
B C D
0 3 0 0
1 1 6 14
2 12 0 0
3 12 14 0
4 8 0 0
df1 = (pd.get_dummies(df.astype(str), prefix='', prefix_sep='')
.max(level=0, axis=1)
.rename(columns=lambda x: int(x))
.reindex(columns=range(1, df.values.max() + 1), fill_value=0)
.add_prefix('prod_'))
print (df1)
prod_1 prod_2 prod_3 prod_4 prod_5 prod_6 prod_7 prod_8 prod_9 \
0 0 0 1 0 0 0 0 0 0
1 1 0 0 0 0 1 0 0 0
2 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 1 0
prod_10 prod_11 prod_12 prod_13 prod_14
0 0 0 0 0 0
1 0 0 0 0 1
2 0 0 1 0 0
3 0 0 1 0 1
4 0 0 0 0 0
另一个类似的解决方案:
df1 = (pd.get_dummies(df.astype(str), prefix='', prefix_sep='')
.max(level=0, axis=1))
df1.columns = df1.columns.astype(int)
df1 = (df1.reindex(columns=range(1, df1.columns.max() + 1), fill_value=0)
.add_prefix('prod_'))
关于python - 使用现有数据框中的值创建包含带有 Pandas 的二进制值列的数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48565092/