Python/Pandas:根据列之间的值匹配来组合来自2个数据帧的列,但不能使用merg

2024-04-23 11:12:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,需要将pmdf中的值与所有代码. 你知道吗

如果pmdf代码在所有代码,我需要一个包含jcrdf和pmdf计数. 你知道吗

数据帧:

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']                        
         })

我有一个允许差异的查找:

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计数. 你知道吗

我尝试从匹配中生成唯一代码的df,但不管这些值必须是什么所有代码. 你知道吗

像往常一样,提前谢谢你的帮助。你知道吗


Tags: 数据代码dataframeindexcodealllookupcodes
1条回答
网友
1楼 · 发布于 2024-04-23 11:12:38

一种方法是展开jcrdf All\ u 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

相关问题 更多 >