Python 中的分组特征矩阵 #2- 跟进
Grouped Feature Matrix in Python #2- Follow Up
和以前没什么区别。我们可以从示例数据开始:
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
我正在寻找一种方法来制作新的 excel 文件,如下所示(预期结果):
-----------------------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
(注意:不需要编号的head-titles,我只是为了清楚和后面的解释才这样做的)。
基本上我所做的是,与另一个非常相似,查找每个名称,然后针对每个名称查看它有多少个不同的编号。然后,它会选择具有一定数量的不同编号的人。 现在,我有一组 "Comments" 和 "Reports" 我想找
({Irrelevant, Whatever, Regardless} 和 {Awesome, Solid, Perfect} 分别 [注意:这只是 Comments/Reports] 的一个子集),对于这些,如果出现,我希望有 1 或 0,但仅限于每个编号换句话说,我希望每个编号都有一个 "group" 列,标题为 {Irrelevant, Whatever, Regardless} 和 {Awesome, Solid, Perfect} 并且对于每个值,如果它出现,我想要一个 1对于该特定编号的人,如果没有则为 0。
例如,在这个矩阵中,我们只看到 John,因为他是唯一一个拥有超过 1 个不同编号的人。在第一组列中,只有 Irrelevant 和 Awesome 的值为 1,而其余的值为 0,并且在第二组只有 Regardless 和 Perfect 会有 1。它所做的是它列出了我想要的所有 Comments/Reports({不相关,随便,不管} 和 {Awesome,Solid,Perfect})只有一个编号,然后找出每个编号是否出现(1 或 0 ).然后它在一个新的 "group" 列中重复所有需要的 Comments/Reports 以获得一个新编号,并且对于这个新编号,找出现在出现的 Comments/Reports。
如果有任何不清楚的地方,请告诉我,非常感谢您的帮助。
谢谢。
尝试:
df_out = df_out[df_out.groupby(['Name'])['No.'].transform(lambda x: x.nunique() > 1)]\
.set_index(['Name','No.'])['Comment'].str.get_dummies()\
.reindex(df_out.Comment, fill_value=0, axis=1)\
.sum(level=[0,1])\
.unstack()\
.swaplevel(0,1,axis=1)\
.sort_index(1)
print(df_out)
输出:
No. 2139300 \
Comment Awesome Doesn't Matter Good Great Irrelevant Perfect Regardless Solid
Name
John 1 0 0 0 1 0 0 0
No. 2234903 \
Comment Something Whatever Awesome Doesn't Matter Good Great Irrelevant
Name
John 0 0 0 0 0 0 0
No.
Comment Perfect Regardless Solid Something Whatever
Name
John 1 1 0 0 0
和以前没什么区别。我们可以从示例数据开始:
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
我正在寻找一种方法来制作新的 excel 文件,如下所示(预期结果):
-----------------------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
(注意:不需要编号的head-titles,我只是为了清楚和后面的解释才这样做的)。
基本上我所做的是,与另一个非常相似,查找每个名称,然后针对每个名称查看它有多少个不同的编号。然后,它会选择具有一定数量的不同编号的人。 现在,我有一组 "Comments" 和 "Reports" 我想找 ({Irrelevant, Whatever, Regardless} 和 {Awesome, Solid, Perfect} 分别 [注意:这只是 Comments/Reports] 的一个子集),对于这些,如果出现,我希望有 1 或 0,但仅限于每个编号换句话说,我希望每个编号都有一个 "group" 列,标题为 {Irrelevant, Whatever, Regardless} 和 {Awesome, Solid, Perfect} 并且对于每个值,如果它出现,我想要一个 1对于该特定编号的人,如果没有则为 0。
例如,在这个矩阵中,我们只看到 John,因为他是唯一一个拥有超过 1 个不同编号的人。在第一组列中,只有 Irrelevant 和 Awesome 的值为 1,而其余的值为 0,并且在第二组只有 Regardless 和 Perfect 会有 1。它所做的是它列出了我想要的所有 Comments/Reports({不相关,随便,不管} 和 {Awesome,Solid,Perfect})只有一个编号,然后找出每个编号是否出现(1 或 0 ).然后它在一个新的 "group" 列中重复所有需要的 Comments/Reports 以获得一个新编号,并且对于这个新编号,找出现在出现的 Comments/Reports。
如果有任何不清楚的地方,请告诉我,非常感谢您的帮助。
谢谢。
尝试:
df_out = df_out[df_out.groupby(['Name'])['No.'].transform(lambda x: x.nunique() > 1)]\
.set_index(['Name','No.'])['Comment'].str.get_dummies()\
.reindex(df_out.Comment, fill_value=0, axis=1)\
.sum(level=[0,1])\
.unstack()\
.swaplevel(0,1,axis=1)\
.sort_index(1)
print(df_out)
输出:
No. 2139300 \
Comment Awesome Doesn't Matter Good Great Irrelevant Perfect Regardless Solid
Name
John 1 0 0 0 1 0 0 0
No. 2234903 \
Comment Something Whatever Awesome Doesn't Matter Good Great Irrelevant
Name
John 0 0 0 0 0 0 0
No.
Comment Perfect Regardless Solid Something Whatever
Name
John 1 1 0 0 0