我有一个有三列的数据帧,每一列包含另一个数据帧或None的列的名称,我想用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 请注意,第一个dataframe也包含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这个代码是基于循环的,显然速度很慢,更像熊猫所需要的。我也是,无法在这个代码中处理值。在执行上面的代码之后,结果就像.
A B C D E None
- - - - - ----
1 0 0 0 0 1
1 1 1 0 0 0
0 1 0 1 1 0因此,真正的问题是,如何更快地做到这一点,以及如何删除名为None的列。任何见解都将不胜感激。
发布于 2019-08-03 10:23:20
使用get_dummies,如果None是字符串,则删除列max,最后获取每个列名的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 0https://stackoverflow.com/questions/57337404
复制相似问题