创建一个新的数据集,列出另一个数据集中的列之间的差异

2024-05-16 12:03:38 发布

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

我一直在试着找出不同群体之间的差异。因为它有点复杂,请看我的工作和代码如下:

从以下数据集开始:

import pandas as pd 
df = {'Occ': ['Chef','Chef','Chef', 
'Programmer','Programmer','Programmer','Data','Data','Data'], 
  'Skill': ['Cook', 'Budget','Communication','Python', 'R','Communication','R','Python','SAS']} 

df = pd.DataFrame(data=df)

测向输出

^{pr2}$

我期望的最终结果,但我没能产生

理想情况下,我需要找出各种可能的工作组合的维度之间的差异。我确实试过了,当我有两个职业时,它起作用了,当我添加第三个职业时,它失败了。我所有的代码都在下面

Occ_s            Occ_t               Skill_missing
Chef             Programmer          Python
Chef             Programmer          R
Chef             Data                SAS
Chef             Data                R
Chef             Data                Python
Programmer       Chef                Cook
Programmer       Chef                Budget
Programmer       Data                SAS
Data             Chef                Cook
Data             Chef                Budget
Data             Chef                Chef   
Data             Programmer          SAS

创建df后,设置一个新变量来标识技能

df['Num'] = 1

堆叠和取消堆叠,找出目标职业缺少哪些技能

df1 = df.set_index(['Occ','Skill'])['Num'].unstack(fill_value=0)

 out = df1.stack(0).reset_index()

我尝试了这个,但我得到重复和结果爆炸,并不像预期的结果上面

iter_df = [[i,j] for i in out['Occ'].unique() for j in out['Occ'].unique() if i!=j]            

iter_df = pd.DataFrame(iter_df, columns=['Occ_s', 'Occ_t'])

final = pd.merge(out,iter_df, left_on='Occ', right_on='Occ_s', how='left')

del final['Occ']

更新问题已经解决了。希望我在应用大数据时也能工作。尽管如此,我还是希望看到一些更简单的方法,因为我认为我的方法是复杂和长。我真的很想看看更简单的解决办法。拜托请参阅下面的代码

test_join = pd.merge(final, df, left_on=['Occ_t','Skill'], right_on= 
['Occ','Skill'], how='outer') 

test_join = test_join.dropna(subset=['Occ'])

test_join = test_join[test_join['Skill_indicator'] !=1]

del test_join['Occ']

test_join = test_join.rename(columns={0:'Skill_indicator'})

test_join = test_join[['Occ_s','Occ_t','Skill','Skill_indicator']]

Tags: 代码testdfdataonoutskillchef
1条回答
网友
1楼 · 发布于 2024-05-16 12:03:38

如果我没听错的话,这会有用的: 此代码属于您:

import pandas as pd 
import copy

df = {'Occ': ['Chef','Chef','Chef', 
           'Programmer','Programmer','Programmer','Data','Data','Data'], 
           'Skill': ['Cook', 'Budget','Communication','Python', 
           'R','Communication','R','Python','SAS']} 

df = pd.DataFrame(data=df)
df = df.set_index(['Occ','Skill'])['Num'].unstack(fill_value=0)

out = df.stack(0).reset_index()

只是添加列名 输出列=['Occ','Skill','tmp']

创建out的副本。在

^{pr2}$

将一改为零,零改为一,将Occ与另一职业合并。因此,我们将得到一个表格,其中每个职业将与另一个职业合并,其中一个职业缺少技能。在

out_2['tmp'] = 1- out_2['tmp']

只是添加列名。在

^{4}$

按计划合并

k= out_2.merge(out,on='tmp',how='inner')

但是我们有重复的每对[Occ,Skill]都在1和0上,所以让我们选择其中一个(我选择了0)。在

k = k[k.tmp==0]

最后一个阶段,我们想得到不同的职业。使用(k.Skill_t==k.Skill)我们可以得到所有的Occ_t和Occ。在

k[(k.Occ_t != k.Occ) & (k.Skill_t==k.Skill)][['Occ_t','Occ','Skill']]

结果:

Out[0]: 
    Occ_t   Occ     Skill

3   Chef    Data    Budget
6   Chef    Programmer  Budget
13  Chef    Data    Communication
23  Chef    Data    Cook
25  Chef    Programmer  Cook
27  Data    Chef    Python
37  Data    Chef    R
47  Data    Chef    SAS
53  Data    Programmer  SAS
58  Programmer  Data    Communication
63  Programmer  Chef    Python
73  Programmer  Chef    R

相关问题 更多 >