将多列值的出现次数标记为pandas数据帧

时间:2018-04-22 02:07:29

标签: python pandas dataframe

考虑到我有一个具有以下结构的数据框:

    Symbol   CS
0     A1    MSI
1     A2    MSI
2     A3    GS
3     A2    EBV
4     A2    CIN
5     A1    GS    
6     A2    MSI
...

我希望有一个数据框将列CS分类为标题,将列符号列为索引。值将是CS类型出现的每个符号。例如,上述数据帧的预期输出为:

    MSI   EBV   CIN   GS
A1   1     0     0    1
A2   2     1     1    0
A3   0     0     0    1

解决这一特殊情况的最有效方法是什么?

2 个答案:

答案 0 :(得分:5)

您可以使用crosstab

pd.crosstab(df.Symbol,df.CS)
Out[862]: 
CS      CIN  EBV  GS  MSI
Symbol                   
A1        0    0   1    1
A2        1    1   0    2
A3        0    0   1    0

答案 1 :(得分:1)

一种方法是使用pd.value_counts后跟pd.pivot_table

修改但实际上你应该使用@Wen's solution

counts = df.groupby('Symbol')['CS'].apply(pd.value_counts).reset_index()

res = counts.pivot_table(index='Symbol', columns='level_1', values='CS',
                         fill_value=0, aggfunc=lambda x: x)

print(res)

# level_1  CIN  EBV  GS  MSI
# Symbol                    
# A1         0    0   1    1
# A2         1    1   0    2
# A3         0    0   1    0