Pandas:如果列名存在于不同的列中,则用1填充列值

2024-09-25 08:41:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有三列的数据框,每列包含另一个数据框或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  

请注意,第一个数据帧也包含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

所以问题是,如何更快地完成这项工作,以及如何删除名为None的列。任何见解都将不胜感激。你知道吗


Tags: 数据代码名称nonedataframedfindexlen
1条回答
网友
1楼 · 发布于 2024-09-25 08:41:16

使用^{},如果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

相关问题 更多 >