鉴于此示例数据集,我试图提醒各公司它们在我们的数据库中有副本,以便它们能够相互通信,并确定此人属于哪一家公司:
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公司
Name SSN Company
Smith, John 1234 A
Smith, John 1234 B
Williams, Joe 1212 A
Williams, Joe 1212 CC公司
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,然后在名称列上将每个公司组与其他组连接起来?
发布于 2020-12-07 22:59:07
首先,我们以Company为基础,轻松地看到多家公司的员工:
df2 = pd.pivot_table(df.assign(count = 1), index = ['Name','SSN'], columns='Company', values='count', aggfunc = 'count')产生
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公司和任何其他公司的人’:
dfA = df2[(~df2['A'].isna()) & (~df2[['B','C','D']].isna()).any(axis=1) ].dropna(how = 'all', axis=1)
dfA这会产生
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。
我们可以很容易地编写一个函数来为任何一家公司生成报告。
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‘:
report_for('B')生成
Company B A
Name SSN
Smith,John 1234 1.0 1.0https://stackoverflow.com/questions/65190544
复制相似问题