Python 3.x 使用权重创建分类数据
我有一个Python 3.x 使用权重创建分类数据,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我有一个数据帧,如下所示: >>> df=pd.DataFrame(np.array([['user1', 1, 10], ['user1', 2, 25], ['user2', 2, 20], ['user3', 3, 30], ['user4', 3, 50]]), columns=['UserId', 'Dim', 'Count']) >>> df UserId Dim Count 0 user1 1 10 1 user1 2
数据帧
,如下所示:
>>> df=pd.DataFrame(np.array([['user1', 1, 10], ['user1', 2, 25], ['user2', 2, 20], ['user3', 3, 30], ['user4', 3, 50]]), columns=['UserId', 'Dim', 'Count'])
>>> df
UserId Dim Count
0 user1 1 10
1 user1 2 25
2 user2 2 20
3 user3 3 30
4 user4 3 50
我想使用Dim
列作为维度,为此我正在做:
>>> df_cat = pd.get_dummies(df, columns=['Dim'])
>>> df_cat
UserId Count Dim_1 Dim_2 Dim_3
0 user1 10 1 0 0
1 user1 25 0 1 0
2 user2 20 0 1 0
3 user3 30 0 0 1
4 user4 50 0 0 1
但是,我不想将0
或1
,而是想将Count
列中的值关联为权重,即,我的预期输出应该如下所示:
UserId Count Dim_1 Dim_2 Dim_3
0 user1 10 10 0 0
1 user1 25 0 25 0
2 user2 20 0 20 0
3 user3 30 0 0 30
4 user4 50 0 0 50
目前,我正在使用for
循环来实现这一点:
for i, row in df_cat.iterrows():
for col in df_cat.columns:
if(row[col] == 1):
df_cat.loc[i, col]=df_cat.Count[i]
请告诉我是否有更好的方法来执行此操作,而不是对循环使用2个,因为循环需要时间,因为实际的数据集非常大。用于重塑形状并添加到原始数据:
您的解决方案应使用以下方法更改:仅添加列和按列计数的列,但必须转换为整数:
df_cat = pd.get_dummies(df, columns=['Dim'])
c = df_cat.columns.str.startswith('Dim')
df_cat.loc[:, c] = df_cat.loc[:, c].mul(df['Count'].astype('int'), axis=0)
print (df_cat)
UserId Count Dim_1 Dim_2 Dim_3
0 user1 10 10 0 0
1 user1 25 0 25 0
2 user2 20 0 20 0
3 user3 30 0 0 30
4 user4 50 0 0 50
感谢您的快速响应。对于我的实际数据集,这两种方法都遇到了内存问题<代码>for
循环也需要时间,但似乎比这两种方法都要快。@sud29-你能检查一下df_cat.loc[:,c]=df_cat.loc[:,c]*df['Count'].values.astype('int')[:,None]
而不是最后一行代码吗?它仍然在崩溃,我想知道是否有办法使用稀疏矩阵来完成它。@sud29-什么失败了pd.get_dummies(df,columns=['Dim'])
?
df_cat = pd.get_dummies(df, columns=['Dim'])
c = df_cat.columns.str.startswith('Dim')
df_cat.loc[:, c] = df_cat.loc[:, c].mul(df['Count'].astype('int'), axis=0)
print (df_cat)
UserId Count Dim_1 Dim_2 Dim_3
0 user1 10 10 0 0
1 user1 25 0 25 0
2 user2 20 0 20 0
3 user3 30 0 0 30
4 user4 50 0 0 50
df_cat = pd.get_dummies(df, columns=['Dim'])
c = df_cat.columns.str.startswith('Dim')
df_cat.loc[:, c] = df_cat.loc[:, c] * df['Count'].values.astype(np.int)[:, None]
print (df_cat)
UserId Count Dim_1 Dim_2 Dim_3
0 user1 10 10 0 0
1 user1 25 0 25 0
2 user2 20 0 20 0
3 user3 30 0 0 30
4 user4 50 0 0 50