如何在没有for循环的情况下从现有列中有效地创建标签列并在之后删除它们

时间:2017-06-28 15:22:58

标签: python pandas

我的数据框看起来像这样:

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) 但它没有工作

2 个答案:

答案 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)

或者suggested by @Ted Petrou -

(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