首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大熊猫按多个类别分类复制

大熊猫按多个类别分类复制
EN

Stack Overflow用户
提问于 2020-12-07 22:45:07
回答 1查看 208关注 0票数 1

鉴于此示例数据集,我试图提醒各公司它们在我们的数据库中有副本,以便它们能够相互通信,并确定此人属于哪一家公司:

代码语言:javascript
复制
Name            SSN      Company
Smith, John     1234     A
Smith, John     1234     B
Jones, Mary     4567     C
Jones, Mary     4567     D
Williams, Joe   1212     A
Williams, Joe   1212     C

理想的输出是提供给每一家公司的数据框架,提醒他们注意数据中的重复和声称分配给他们的同一人的另一家公司的身份。就像这样:

A公司

代码语言:javascript
复制
Name             SSN      Company
Smith, John      1234     A
Smith, John      1234     B
Williams, Joe    1212     A
Williams, Joe    1212     C

C公司

代码语言:javascript
复制
Name             SSN      Company
Jones, Mary      4567     C
Jones, Mary      4567     D
Williams, Joe    1212     A
Williams, Joe    1212     C

所以,尝试了groupby ' Company ',但是,当然,只有所有的公司都在一个组中,它省略了另一个公司的复制人和SSN。某些版本的groupby (在该版本的逻辑中很深)看起来应该可以工作,但是按多列分组,并不完全是这样。输出将按公司分组,但包含与该公司组中的所有值相关联的重复值。一个谜,因此我的职位。

也许groupby Company,然后在名称列上将每个公司组与其他组连接起来?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-07 22:59:07

首先,我们以Company为基础,轻松地看到多家公司的员工:

代码语言:javascript
复制
df2 = pd.pivot_table(df.assign(count = 1), index = ['Name','SSN'], columns='Company', values='count', aggfunc = 'count')

产生

代码语言:javascript
复制
    Company             A   B   C   D
Name            SSN             
Jones,Mary      4567    NaN NaN 1.0 1.0
Smith,John      1234    1.0 1.0 NaN NaN
Williams,Joe    1212    1.0 NaN 1.0 NaN

价值是该公司雇员的计算值,而NaN表示他不在公司中。

现在我们可以为不同的公司提取有用的观点。对于A,我们可以说‘拉每个在A公司和任何其他公司的人’:

代码语言:javascript
复制
dfA = df2[(~df2['A'].isna()) & (~df2[['B','C','D']].isna()).any(axis=1) ].dropna(how = 'all', axis=1)
dfA

这会产生

代码语言:javascript
复制
    Company              A  B   C
Name            SSN         
Smith,John      1234    1.0 1.0 NaN
Williams,Joe    1212    1.0 NaN 1.0

注意,在这里,我们通过dropna(...)删除了一些不相关的公司,在本例中是D,因为A和D之间没有重叠,而且D列都有NaNs。

我们可以很容易地编写一个函数来为任何一家公司生成报告。

代码语言:javascript
复制
def report_for(company_name):
    companies = df2.columns
    other_companies = [c for c in companies if c != company_name]
    return (df2[(~df2[company_name].isna()) 
              & (~df2[other_companies].isna()).any(axis=1) ]
              .loc[:,[company_name] + other_companies]
              .dropna(how = 'all', axis=1)
              )

注意,我们还重新排序了列,因此公司“B”的表中有第一列'B‘:

代码语言:javascript
复制
report_for('B')

生成

代码语言:javascript
复制
    Company         B   A
Name        SSN     
Smith,John  1234    1.0 1.0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65190544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档