我有两个数据帧,我需要分隔行,其中pmdf的值与jcrdf.All_codes中的一个代码匹配。
如果pmdf.code在jcrdf.All_codes中,我需要一个包含jcrdf和pmdf.count中所有值的数据帧。
Dataframes:
pmdf = pd.DataFrame(
{
'code': ['0567-8315','0007-4977','0096-0225','1365-2133','8675-309J'],
'count':['6','7','10','2','1']
}
)
jcrdf = pd.DataFrame(
{
'jobtitle': ['manager','technician','noob','retiree'],
'location': ['loc1','loc3','loc4','loc2'],
'jcode' : ['4444-4444','3333-3333','2222-2222','1111-1111'],
'All_codes': ['0096-0225,0096-0225','1820-7448,0567-8315,0567-8315','0007-4977,0007-4977','0007-0963,0007-0963,0366-077X,1365-2133']
})
我有一个允许diff:
的查找jcrdf_lookup = pd.DataFrame(jcrdf['All_codes'].str.split(',').tolist(),
index=jcrdf.jcode).stack(level=0).reset_index(level=0)
matches = jcrdf_lookup[jcrdf_lookup[0].isin(pmdf.code)]
jcrdfmatch = jcrdf[jcrdf.jcode.isin(matches.jcode)]
jcrdfnomatch = pmdf[~pmdf.code.isin(matches[0])]
但我无法弄清楚如何包含pmdf.count。
我尝试从匹配中创建df的唯一代码,但无论这些值必须在jcfdf.All_codes中。
提前感谢您提供任何协助。
答案 0 :(得分:1)
一种方法是扩展jcrdf All_codes列,然后使用merge
jcrdf_temp = jcrdf.set_index(['jcode', 'jobtitle', 'location']).All_codes.str.split(',',expand = True)\
.stack().reset_index(3,drop = True).reset_index(name = 'All_codes')
new_df = pd.merge(pmdf, jcrdf_temp, left_on = 'code', right_on = 'All_codes')
你得到了
code count jcode jobtitle location All_codes
0 0567-8315 6 3333-3333 technician loc3 0567-8315
1 0567-8315 6 3333-3333 technician loc3 0567-8315
2 0007-4977 7 2222-2222 noob loc4 0007-4977
3 0007-4977 7 2222-2222 noob loc4 0007-4977
4 0096-0225 10 4444-4444 manager loc1 0096-0225
5 0096-0225 10 4444-4444 manager loc1 0096-0225
6 1365-2133 2 1111-1111 retiree loc2 1365-2133
如果您想要原始格式的数据
new_df = new_df.drop('All_codes', 1).groupby(['jcode', 'jobtitle', 'count', 'location']).code.apply(','.join).reset_index()
jcode jobtitle count location code
0 1111-1111 retiree 2 loc2 1365-2133
1 2222-2222 noob 7 loc4 0007-4977,0007-4977
2 3333-3333 technician 6 loc3 0567-8315,0567-8315
3 4444-4444 manager 10 loc1 0096-0225,0096-0225