在一行而不是多行中获取编码的分类变量
get encoded categorical variables in one row rather than multiple rows
我有与此类似的原始数据框
my_df = pd.DataFrame({'uid': [4, 3, 6, 4, 3, 6, 1],'days': ['D1', 'D3', 'D3', 'D4', 'D4', 'D2','D2']})
uid days
0 4 D1
1 3 D3
2 6 D3
3 4 D4
4 3 D4
我使用 get_dummies() 得到了这种编码数据帧。
my_new_df = pd.get_dummies(my_df ,columns=['days'])
uid days_D1 days_D2 days_D3 days_D4
0 4 1 0 0 0
1 3 0 0 1 0
2 6 0 0 1 0
3 4 0 0 0 1
4 3 0 0 0 1
我想要一个数据框,其中我的所有分类值都针对每个 uid 编码在一行中。像这样
uid D1 D2 D3 D4
4 1 0 0 1
3 0 0 1 1
6 0 1 1 0
1 0 1 0 0
我曾尝试寻找一种优化方法来实现此结果,但我无法做到。我的原始数据框有 222000 个值。请建议像这样获取编码分类变量的方法
您可以尝试在 uid
上分组并在 get_dummies
之后获取其他列的最大值
(pd.get_dummies(my_df ,columns=['days'],prefix='',prefix_sep='')
.groupby('uid',sort=False).max())
或者和枢轴替代:
my_df.pivot_table(index="uid",columns="days",aggfunc='size',fill_value=0)
D1 D2 D3 D4
uid
4 1 0 0 1
3 0 0 1 1
6 0 1 1 0
1 0 1 0 0
试试这个选项:
ss = pd.get_dummies(my_df, columns=['days']).groupby(['uid'], as_index=False).sum()
print(ss)
输出:
uid days_D1 days_D2 days_D3 days_D4
0 1 0 1 0 0
1 3 0 0 1 1
2 4 1 0 0 1
3 6 0 1 1 0
您可以使用 crosstab
+ clip
:
df = pd.crosstab(my_df['uid'], my_df['days']).clip(upper=1)
days D1 D2 D3 D4
uid
1 0 1 0 0
3 0 0 1 1
4 1 0 0 1
6 0 1 1 0
我有与此类似的原始数据框
my_df = pd.DataFrame({'uid': [4, 3, 6, 4, 3, 6, 1],'days': ['D1', 'D3', 'D3', 'D4', 'D4', 'D2','D2']})
uid days
0 4 D1
1 3 D3
2 6 D3
3 4 D4
4 3 D4
我使用 get_dummies() 得到了这种编码数据帧。
my_new_df = pd.get_dummies(my_df ,columns=['days'])
uid days_D1 days_D2 days_D3 days_D4
0 4 1 0 0 0
1 3 0 0 1 0
2 6 0 0 1 0
3 4 0 0 0 1
4 3 0 0 0 1
我想要一个数据框,其中我的所有分类值都针对每个 uid 编码在一行中。像这样
uid D1 D2 D3 D4
4 1 0 0 1
3 0 0 1 1
6 0 1 1 0
1 0 1 0 0
我曾尝试寻找一种优化方法来实现此结果,但我无法做到。我的原始数据框有 222000 个值。请建议像这样获取编码分类变量的方法
您可以尝试在 uid
上分组并在 get_dummies
(pd.get_dummies(my_df ,columns=['days'],prefix='',prefix_sep='')
.groupby('uid',sort=False).max())
或者和枢轴替代:
my_df.pivot_table(index="uid",columns="days",aggfunc='size',fill_value=0)
D1 D2 D3 D4
uid
4 1 0 0 1
3 0 0 1 1
6 0 1 1 0
1 0 1 0 0
试试这个选项:
ss = pd.get_dummies(my_df, columns=['days']).groupby(['uid'], as_index=False).sum()
print(ss)
输出:
uid days_D1 days_D2 days_D3 days_D4
0 1 0 1 0 0
1 3 0 0 1 1
2 4 1 0 0 1
3 6 0 1 1 0
您可以使用 crosstab
+ clip
:
df = pd.crosstab(my_df['uid'], my_df['days']).clip(upper=1)
days D1 D2 D3 D4
uid
1 0 1 0 0
3 0 0 1 1
4 1 0 0 1
6 0 1 1 0