假设我有一个数据框:
df = pd.DataFrame({'label': [0, 1, 2, 0, 1, 2], 'cat_col': [1, 1, 2, 2, 3, 3]})
cat_col label
0 1 0
1 1 1
2 2 2
3 2 0
4 3 1
5 3 2
我想将此数据框转换为以下内容:
cat_col, label, count_when_label_is_0, count_when_label_is_1, count_when_label_is_2
1 0 1, 1, 0
1 1 1, 1, 0
...
所以基本上我为每个标签值(多项标签)添加一列,并且当row.cat_col就是该行中的那个时,我为每个行添加了该标签值的计数。我目前有这个,但它很慢:
size = df[['cat_col', 'label']].groupby(['cat_col', 'label']).size()
def get_size(cat_val, label_val):
if label_val in size[cat_val]: return size[cat_val][target_val]
return 0
for label_val in range(9): # 9 classes in multinominal label
df['new_col_' + str(label_val)] = df['cat_col'].apply(
lambda cat_val: get_size(cat_val, label_val))
答案 0 :(得分:0)
您可以使用pivot_table
:
In [11]: df.pivot_table(index="cat_col", columns="label", aggfunc=len, fill_value=0)
Out[11]:
label 0 1 2
cat_col
1 1 1 0
2 1 0 1
3 0 1 1