从两个值之和生成虚拟列的python方法

2024-04-25 22:57:18 发布

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

我有一个数据帧,其中一列名为label,它的值为[0,1,2,3,4,5,6,8,9]。 我想用它生成虚拟列,但我希望将一些标签连接在一起,例如,如果观测值有标签0、1或2,我希望dummy_012为1

如果我使用命令df2 = pd.get_dummies(df, columns=['label']),它将创建9列,每个标签1列

我知道我可以在那之后使用df2['dummy_012']=df2['dummy_0']+df2['dummy_1']+df2['dummy_2']将其转换为一个joint列,但我想知道是否有更类似python的方法(或者一些函数,我可以将参数更改为join)


Tags: columns数据方法函数命令df参数get
2条回答

我不知道这是pythonic,因为可能存在一个更优雅的解决方案,但我允许您更改参数,并将其矢量化。我读到过get_dummies()在处理大量数据时可能有点慢,一般来说,矢量化熊猫是一种很好的做法。所以我把这个函数矢量化,让它用numpy数组进行计算。与类似函数相比,当数据集的大小增加时,它应该会提高性能

此函数将把数据帧和数字列表作为字符串,并返回数据帧和所需的列

def get_dummy(df,column_nos):
    new_col_name = 'dummy_'+''.join([i for i in column_nos])
    vector_sum = sum([df[i].values for i in column_nos])
    df[new_col_name] = [1 if i>0 else 0 for i in vector_sum]

    return df

如果您希望输入是整数而不是字符串,可以调整上面的函数,如下所示

def get_dummy(df,column_nos):
    column_names = ['dummy_'+str(i) for i in column_nos]
    new_col_name = 'dummy_'+''.join([str(i) for i in sorted(column_nos)])

    vector_sum = sum([df[i].values for i in column_names])
    df[new_col_name] = [1 if i>0 else 0 for i in vector_sum]

    return df

也许这种方法可以提供一个想法:

groups = ['012', '345', '6789']
for gp in groups:
    df.loc[df['Label'].isin([int(x) for x in gp]), 'Label_Group'] = f'dummies_{gp}'

输出:

   Label   Label_Group
0      0   dummies_012
1      1   dummies_012
2      2   dummies_012
3      3   dummies_345
4      4   dummies_345
5      5   dummies_345
6      6  dummies_6789
7      8  dummies_6789
8      9  dummies_6789

然后应用假人:

df_dummies = pd.get_dummies(df['Label_Group'])
   dummies_012  dummies_345  dummies_6789
0            1            0             0
1            1            0             0
2            1            0             0
3            0            1             0
4            0            1             0
5            0            1             0
6            0            0             1
7            0            0             1
8            0            0             1

相关问题 更多 >