我的数据框看起来像这样:
HotelService
我想检查列中的每个值并从该列中创建一个新值,以便如果值大于0则新列的每一行都为1,否则为
我用这种方式使用for循环:
A B C D
2 5 0 9
2 0 8 0
0 0 8 9
2 0 8 0
0 5 0 9
2 0 8 9
0 5 0 9
2 5 8 0
我的问题是:
1-如何在没有for循环的情况下执行相同的任务?
2-如何在操作后删除列?我已经尝试了 #Generate a data frame example
df = pd.DataFrame(np.random.randint(5, size=(10, 8)), columns = ["A", "B", "C", "D", "E","F","G", "H"])
# create a label out of it
for label in df.columns.values:
df['label_' + label] = df[label].apply(lambda a: 0 if a==0 else 1)
df.drop(label, axis=1)
但它没有工作
答案 0 :(得分:2)
你可以做的IIUC -
df_out = (df>0).astype(int)
df_out.columns = ['label_'+i for i in df.columns]
创建这些新标签的矢量化方法是使用NumPy's char supported functions
-
df_out.columns = np.core.add('label_',df.columns)
(df>0).astype(int).add_prefix('label_')
答案 1 :(得分:2)
另一种选择......
df2 = df.mask(df != 0).fillna('1').add_prefix('label_')
print(df2)
label_A label_B label_C label_D label_E label_F label_G label_H
0 1 1 1 1 1 1 1 1
1 1 1 0 1 1 1 0 0
2 1 0 0 1 1 0 0 1
3 1 1 1 0 1 1 1 0
4 1 1 1 1 1 1 1 1
5 1 0 0 1 1 1 1 0
6 1 1 1 1 1 1 1 1
7 1 0 1 0 1 0 1 0
8 1 1 1 1 1 1 1 1
9 0 1 1 1 0 1 1 1