创建另一个数据集的列之间差异的新数据集
Create a new data set of the differences between columns of another dataset
我一直在努力寻找不同群体之间的差异。因为它有点复杂,所以请看下面我的工作和代码:
从如下数据集开始:
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)
df 的输出
Occ Skill
Chef Cook
Chef Budget
Chef Communication
Programmer Python
Programmer R
Programmer Communication
Data R
Data Python
Data SAS
我预期的最终结果,但我未能产生
理想情况下,我需要找到每种可能的工作组合的维度之间的差异。我确实尝试过,当我有 2 个职业时它起作用了,当我添加第三个职业然后它失败了。我所有的代码都在下面
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']
更新问题已解决。希望当我应用到大数据时也能正常工作。尽管如此,我还是希望看到一些更简单的方法,因为我认为我的方法很复杂,long.Im 真的很想看到一些更简单的方法 solutions.Please 请参阅下面我的其余代码。
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']]
如果我理解正确的话,这会起作用:
此代码是您的:
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()
只需添加列名
out.columns =['Occ','Skill','tmp']
正在创建 out 的副本。
out_2 = copy.deepcopy(out)
一变零,零变一,将Occ与其他职业合并。所以我们会得到一个table,其中每个职业都将与另一个职业合并,其中一个职业的技能缺失。
out_2['tmp'] = 1- out_2['tmp']
只需添加列名。
out_2.columns =['Occ_t','Skill_t','tmp']
按计划合并
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
我一直在努力寻找不同群体之间的差异。因为它有点复杂,所以请看下面我的工作和代码:
从如下数据集开始:
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)
df 的输出
Occ Skill
Chef Cook
Chef Budget
Chef Communication
Programmer Python
Programmer R
Programmer Communication
Data R
Data Python
Data SAS
我预期的最终结果,但我未能产生
理想情况下,我需要找到每种可能的工作组合的维度之间的差异。我确实尝试过,当我有 2 个职业时它起作用了,当我添加第三个职业然后它失败了。我所有的代码都在下面
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']
更新问题已解决。希望当我应用到大数据时也能正常工作。尽管如此,我还是希望看到一些更简单的方法,因为我认为我的方法很复杂,long.Im 真的很想看到一些更简单的方法 solutions.Please 请参阅下面我的其余代码。
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']]
如果我理解正确的话,这会起作用: 此代码是您的:
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()
只需添加列名 out.columns =['Occ','Skill','tmp']
正在创建 out 的副本。
out_2 = copy.deepcopy(out)
一变零,零变一,将Occ与其他职业合并。所以我们会得到一个table,其中每个职业都将与另一个职业合并,其中一个职业的技能缺失。
out_2['tmp'] = 1- out_2['tmp']
只需添加列名。
out_2.columns =['Occ_t','Skill_t','tmp']
按计划合并
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