2017-08-11 11 views
1

データフレームに重複する値があります。重複の2例パンダの列として複製辞書を作成

  1. 同じカテゴリに二つの異なるカテゴリーにルールとして

を示す二回

  • 同じIDを示す同じIDがありますが、1-1のマッピングがあるはずですIDからカテゴリへ。

    問題を調査する必要があり、ID列に重複値がない新しいデータフレームを作成したいが、私は辞書である2番目の列がある。ディクショナリのキーは、IDがマップされるカテゴリであり、値はカウントです。例えば、ケース1では値2の1要素辞書があり、ケース2では2の要素辞書があり、各キーの値は1である。

    以下はデータフレームdfの例である。

    ID   Category 
    1001   cat1 
    1002   cat1 
    1002   cat1 
    1003   cat1 
    1003   cat2 
    1004   cat2 
    

    お勧めはありますか?

    おそらく
  • 答えて

    0

    ない最も効率的なソリューションが、動作します:

    from collections import defaultdict 
    def list_to_dict(x): 
        d = defaultdict(int) 
        for key in x: 
         d[key] += 1 
        return dict(d) 
    
    d = {"ID": pd.Series([1001,1002,1002,1003,1003,1004]), "Category": pd.Series(['cat1','cat1','cat1','cat1','cat2','cat2'])} 
    df = pd.DataFrame(d) 
    
    df.groupby('ID')['Category'].apply(list).apply(list_to_dict) 
    

    出力は次のようになります。

    ID 
    1001    {u'cat1': 1} 
    1002    {u'cat1': 2} 
    1003 {u'cat1': 1, u'cat2': 1} 
    1004    {u'cat2': 1} 
    
    0

    そう簡単ではない - groupbyを使用してvalue_countsto_dictとラムダ関数を適用します。

    dictの場合trick - 最初にdictをリストに作成し、次に各リストをstr[0]で選択します。

    df1 = df.groupby('ID')['Category'] 
         .apply(lambda x: [x.value_counts().to_dict()]) 
         .str[0] 
         .reset_index() 
    print (df1) 
        ID    Category 
    0 1001    {'cat1': 1} 
    1 1002    {'cat1': 2} 
    2 1003 {'cat1': 1, 'cat2': 1} 
    3 1004    {'cat2': 1} 
    
    0

    コード:

    from collections import Counter 
    df2 = df.groupby(["ID"])["Category"].apply(lambda x : Counter(list(x))) 
    

    テスト:

    df2.loc[1002]["cat1"] 
    df2.loc[1003]["cat1"] 
    

    結果:

    2.0 
    1.0 
    
    +1

    は、残念ながら、あなたがこのようdictの列を作成することはできません - またはパンダ場所のいくつかoldierバージョンを使用しています出来ますか。バージョン '0.20.3'では' MultiIndex'で新しい 'Series'を返します。 – jezrael

    関連する問題