熊猫:如果列名存在于其他列中,则用1填充列值

时间:2019-08-03 10:20:16

标签: python pandas

我有一个包含三列的数据框,每一列包含另一个数据框或None的一列的名称,我想用{{填充第二个数据框的每一行1}},具体取决于其名称是否在第一个数据帧的三列之一中。这是描述所需结果的示例...

1/0

请注意,第一个数据帧也包含df-1 : col_1 col_2 col_3 ----- ----- ----- A None None A B C D E B df-2 (Initially) : A B C D E - - - - - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 df-2 (expected) : A B C D E - - - - - 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 个值,最终结果中不需要这些值。

我写的一些代码

None

此代码是基于循环的,显然很慢,需要更多类似的熊猫。我也无法处理此代码中的df_2 = pd.DataFrame(0, index = np.arange(len(df_1)), columns = column_names) for i in range(0, len(df_1)): a, b, c = df_1.loc[i, :] df_2.loc[i, a] = 1 df_2.loc[i, b] = 1 df_2.loc[i, c] = 1 。执行完上面的代码后,结果类似于...

None

实际上,问题是,如何更快地执行此操作,以及如何删除名为A B C D E None - - - - - ---- 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1 0 的列。任何见解将不胜感激。

1 个答案:

答案 0 :(得分:2)

使用get_dummies,如果None是字符串,则删除列None,最后每列名称得到max

df1 = pd.get_dummies(df, prefix_sep='', prefix='').drop('None', axis=1).max(level=0, axis=1)
print (df1)
   A  D  B  E  C
0  1  0  0  0  0
1  1  0  1  0  1
2  0  1  1  1  0

如果None不是字符串,大熊猫会默认将其删除:

print (df.applymap(type))
           col_1               col_2               col_3
0  <class 'str'>  <class 'NoneType'>  <class 'NoneType'>
1  <class 'str'>       <class 'str'>       <class 'str'>
2  <class 'str'>       <class 'str'>       <class 'str'>

df2 = pd.get_dummies(df, prefix_sep='', prefix='').max(level=0, axis=1)
print (df2)
   A  D  B  E  C
0  1  0  0  0  0
1  1  0  1  0  1
2  0  1  1  1  0