Python中的分组特征矩阵

时间:2018-03-30 21:32:57

标签: python excel pandas dataframe

给定大的excel数据(xlsx,csv或xls),可以对事物进行分组,然后将其作为特征矩阵,如下例所示。

采取:

DataFrame1:

Name         No.        Comment    
Bob        2123320     Doesn't Matter   
Joe        2832883     Whatever           
John       2139300     Irrelevant        
Bob        2123320     Something          
John       2234903     Regardless

DataFrame2:

Name          No.          Report    
Bob        2123320         Great 
Joe        2832883         Solid           
John       2139300        Awesome        
Bob        2123320         Good          
John       2234903        Perfect

我基本上正在寻找一种方法,只选择一个名称出现两次的号码,然后列出一个特征矩阵,以查看特定的评论/报告是否出现在这个号码上,就像这样:

Name Irrelevant Whatever Regardless Awesome Solid Perfect  Irrelevant \
John    1          0       0          1      0     0         0
Name Whatever Regardless Awesome Solid Perfect  
John    0       1         0        0      1

所以基本上它会查找每个名称,然后对于每个名称,它会查看它有多少不同的号码,并且对于每个不同的号码,它会搜索"注释"和"报告"是的,然后是一些具体的评论 {不相关,无论如何,无论如何}和报告{Awesome,Solid,Perfect}它会检查它是否出现。如果是,则输出1,如果不是,则在如上所述的excel表中输出0。虽然Bob出现了两次,但由于两次他都有相同的号码,所以不算数,John是唯一的相关人物。因此,对于约翰的第2139300号而言,他对于无关紧要和令人敬畏的人而言,并且对于他的第2234903号而言,无论如何都是完美无缺的。

新:

.      -----------------------2139300---------------------  2234903----                    
Name Irrelevant Whatever Regardless Awesome Solid Perfect  Irrelevant \
John    1          0       0          1      0     0         0
      --------------------2234903-------------
Name Whatever Regardless Awesome Solid Perfect  
John    0       1         0        0      1

此外,由于格式化有点奇怪,我的意思是将它全部放在一行。

澄清:这看起来很相似,但与我之前提出的问题不同。我已经为这个问题创建了一个新问题,因为我已被告知要这样做。

非常感谢你。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

首先重命名'报告'列到'评论'对齐concat的数据帧:

df_out = pd.concat([df1,df2.rename(columns={'Report':'Comment'})],ignore_index=False)

过滤具有多个号码的名称的数据帧,然后使用get_dummies

df_out[df_out.groupby(['Name'])['No.'].transform(lambda x: x.nunique() > 1)]\
   .set_index('Name')['Comment'].str.get_dummies().sum(level=0)\
   .reindex(df_out.Comment, fill_value=0, axis=1)

输出:

Comment  Doesn't Matter  Whatever  Irrelevant  Something  Regardless  Great  \
Name                                                                          
John                  0         0           1          0           1      0   

Comment  Solid  Awesome  Good  Perfect  
Name                                    
John         0        1     0        1