Buat kerangka data dari pasangan nilai unik dengan memfilter beberapa kolom

Saya ingin memfilter nilai di beberapa kolom membuat kerangka data untuk kombinasi nilai unik. Bantuan apa pun akan dihargai.

Ini kode saya yang gagal (mengingat kerangka data df):

dd = defaultdict(dict)  #create blank default dictionary
values_col1 = df.col1.unique()   #get the unique values from column 1 of df
for i in values_col1:
    dd[i] = df[(df['col1']==i)]    #for each unique value create a sorted df and put in in a dictionary
    values_col2 = dd[i].col2.unique() #get the unique values from column2 of df
    for m in values_col2:  
        dd[i][m] = dd[i][(dd[i]['col2']==m)]  #for each unique column2 create a sub dictionary

Ketika saya menjalankannya saya mendapatkan pesan kesalahan yang sangat panjang. Saya tidak akan memasukkan semuanya di sini, tapi ini beberapa di antaranya:

C:\Anaconda3\lib\site-packages\pandas\indexes\base.py di get_loc(self, key, metode, toleransi) 1944 coba: -> 1945 kembalikan self._engine.get_loc(key) 1946 kecuali KeyError:

...

ValueError: Jumlah item yang lolos 6 salah, penempatan menyiratkan 1


person sparrow    schedule 06.07.2016    source sumber
comment
Pelajari tentang permutasi numpy.   -  person Merlin    schedule 06.07.2016


Jawaban (1)


Gunakan fungsionalitas pandas groupby untuk mengekstrak indeks unik dan baris yang sesuai dari kerangka data Anda.

import pandas as pd
from collections import defaultdict

df = pd.DataFrame({'col1': ['A']*4 + ['B']*4,
                   'col2': [0,1]*4,
                   'col3': np.arange(8),
                   'col4': np.arange(10, 18)})

dd = defaultdict(dict)
grouped = df.groupby(['col1', 'col2'])
for (c1, c2), g in grouped:
    dd[c1][c2] = g

Ini adalah df yang dihasilkan:

  col1  col2  col3  col4
0    A     0     0    10
1    A     1     1    11
2    A     0     2    12
3    A     1     3    13
4    B     0     4    14
5    B     1     5    15
6    B     0     6    16
7    B     1     7    17

Dan ini hasil ekstraknya dd (yah, dict(dd) kok)

{'B': {0:   col1  col2  col3  col4
          4    B     0     4    14
          6    B     0     6    16,
       1:   col1  col2  col3  col4
          5    B     1     5    15
          7    B     1     7    17},
 'A': {0:   col1  col2  col3  col4
          0    A     0     0    10
          2    A     0     2    12,
       1:   col1  col2  col3  col4
          1    A     1     1    11
          3    A     1     3    13}}

(Saya tidak tahu apa kasus penggunaan Anda untuk ini, tetapi Anda mungkin lebih baik tidak menguraikan objek groupby ke kamus).

person Alberto Garcia-Raboso    schedule 06.07.2016
comment
Terima kasih Alberto, bagaimana cara membuat grup pada kode di atas? - person sparrow; 06.07.2016
comment
Maaf, lupa menyalin baris itu. Diedit. - person Alberto Garcia-Raboso; 06.07.2016
comment
Terima kasih atas solusi elegannya! - person sparrow; 06.07.2016