ホーム>source

グループ間の違いを見つけようとしていました。少し複雑なので、私の作品とコードをご覧ください:

以下のデータセットから開始します。
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

私の期待する最終結果、私はそれを生成できませんでした

理想的には、ジョブのあらゆる可能な組み合わせの次元間の違いを見つける必要があります。私は試してみましたが、3つの職業を追加したときに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']

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

あなたの答え
  • 解決した方法 # 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)
    
    

    Occを別の職業とマージするために、1をゼロに、0を1に変更します。そのため、すべての職業が別の職業と統合され、1つの職業のスキルが失われたテーブルを取得します。

    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になるように重複しているので、そのうちの1つを選択します(0を選択しました)。

    k = k[k.tmp==0]
    
    

    そして最終段階では、さまざまな職業に就きたいと考えています。 (k.Skill_t == k.Skill)を使用すると、1つのスキルですべての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
    
    

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ c# - runat属性を追加した後にdiv要素が表示されないが、コードビハインドでそのIDにアクセスできる