【问题标题】:Create a new data set of the differences between columns of another dataset创建另一个数据集的列之间差异的新数据集
【发布时间】:2018-08-20 11:03:07
【问题描述】:

我一直在尝试找出群体之间的差异。因为它有点复杂,所以请在下面查看我的工作和代码:

从如下数据集开始:

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

我预期的最终结果,我未能产生

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

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

UPDATE 问题解决了。希望当我申请大数据时也能正常工作。尽管如此,我还是希望看到一些更简单的方法,因为我认为我的方法既复杂又冗长。我真的很想看到一些更简单的解决方案。请在下面查看我的其余代码。

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

【问题讨论】:

    标签: python loops difference listiterator


    【解决方案1】:

    如果我理解正确,这将有效: 这段代码是你的:

    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)
    

    将 1 变为 0 并将 0 变为 1,以将 Occ 与另一个职业合并。所以我们会得到一个表格,其中每个职业都将与另一个职业合并,其中一个职业缺少技能。

    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)。

    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
    

    【讨论】:

    • 你能评论一下这部分吗:out_2 = copy.deepcopy(out) out_2['tmp'] = 1- out_2['tmp'] out_2.columns =['Occ_t',' Skill_t','tmp'] k= out_2.merge(out,on='tmp',how='inner') k = k[k.tmp==0] k[(k.Occ_t != k.Occ) & (k.Skill_t==k.Skill)][['Occ_t','Occ','Skill']]
    • 当然。我添加了cmets。尽力了._。如果您有任何问题,我会尽力解答。
    • Egiarizan,谢谢,我上面的代码也有效,我喜欢你的方法。现在我面临的问题是我的数据集太大了,所有组合都高达 120 亿。我正在尝试按职业循环一个职业,但仍在努力
    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多