与以前没什么不同。我们可以从示例数据开始:
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
(注意:它不需要具有编号的头部标题,我只是为了清晰和后面的解释而这样做。)
基本上我所做的是,非常类似于另一个,查找每个名称,然后对于每个名称,它看起来有多少不同的号码。然后它选择具有一定数量的不同号码的人。 现在,我想要一套“评论”和“报告” ({不相关,无论如何,无论如何}和{Awesome,Solid,Perfect}分别[注意:这只是评论/报告的一个子集])对于这些我想要一个1或0如果它出现但只针对每个否换句话说,我希望每个号码都有一个标题为{Irrelevant,Whatever,Regardless}和{Awesome,Solid,Perfect}的列的“组”,并且对于每个值,我想要1,如果它出现在特定号码,如果没有则为0。
在这个矩阵中,例如,我们只看到John,因为他是唯一一个具有多于1个不同的编号。在第一组列中,只有Irrelevant和Awesome的值为1,而其余的值为0,而在第二列中只有团队无论如何,完美将拥有1。它所做的是它列出了我所需的所有评论/报告({不相关,无论如何,无论如何}和{真棒,坚实,完美})只有一个号码,然后发现每个是否出现(1或0)。然后,它在一个新的“组”列中重复了所有所需的评论/报告,以获得新的编号。对于这个新的编号,我们发现了哪些评论/报告现在出现了。
如果有任何不清楚的地方,请告诉我,我真的非常感谢您的帮助。
谢谢。
答案 0 :(得分:1)
尝试:
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