从两个值的总和制作虚拟列的pythonic方法
pythonic way of making dummy column from sum of two values
我有一个数据框,其中有一列名为 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']
将它变成一个联合专栏,但我想知道是否有更 pythonic 的方式来做到这一点(或一些我可以更改参数的函数连接)。
也许这种方法可以提供一个思路:
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
我不知道这是 pythonic,因为可能存在更优雅的解决方案,但我确实允许您更改参数并且它是矢量化的。我读过 get_dummies() 对于大量数据可能会有点慢,并且矢量化 pandas 通常是一种很好的做法。所以我将这个函数向量化,并让它用 numpy 数组进行计算。与类似函数相比,随着数据集大小的增加,它应该可以提高性能。
此函数会将您的数据框和数字列表作为字符串,并将 return 您的数据框包含您想要的列。
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
我有一个数据框,其中有一列名为 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']
将它变成一个联合专栏,但我想知道是否有更 pythonic 的方式来做到这一点(或一些我可以更改参数的函数连接)。
也许这种方法可以提供一个思路:
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
我不知道这是 pythonic,因为可能存在更优雅的解决方案,但我确实允许您更改参数并且它是矢量化的。我读过 get_dummies() 对于大量数据可能会有点慢,并且矢量化 pandas 通常是一种很好的做法。所以我将这个函数向量化,并让它用 numpy 数组进行计算。与类似函数相比,随着数据集大小的增加,它应该可以提高性能。
此函数会将您的数据框和数字列表作为字符串,并将 return 您的数据框包含您想要的列。
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