Konversi Pandas DataFrame ke kamus


168

Saya memiliki DataFrame dengan empat kolom. Saya ingin mengonversi DataFrame ini ke kamus python. Saya ingin elemen kolom pertama keysdan elemen kolom lain di baris yang sama values.

DataFrame:

    ID   A   B   C
0   p    1   3   2
1   q    4   3   2
2   r    4   0   9  

Outputnya harus seperti ini:

Kamus:

{'p': [1,3,2], 'q': [4,3,2], 'r': [4,0,9]}

4
Dataframe.to_dict()?
Anzel

3
Dataframe.to_dict()akan membuat A,B,Ckunci bukanp,q,r
Pangeran Bhatti

@ jezrael cara mendapatkan hasil berikut? {2: {'p': [1,3]}, 2: {'q': [4,3]}, 9: {'r': [4,0]}} untuk dataset yang sama?
panda

@jezrael, kolom yang setara dengan pertanyaan di atas {'c': {'ID': 'A', 'B'}}
panda

Jawaban:


338

The to_dict()metode menetapkan nama kolom sebagai kunci kamus sehingga Anda akan perlu untuk membentuk kembali DataFrame Anda sedikit. Mengatur kolom 'ID' sebagai indeks dan kemudian mentransposisi DataFrame adalah salah satu cara untuk mencapai ini.

to_dict()juga menerima argumen 'orient' yang Anda perlukan untuk menampilkan daftar nilai untuk setiap kolom. Jika tidak, kamus formulir {index: value}akan dikembalikan untuk setiap kolom.

Langkah-langkah ini dapat dilakukan dengan baris berikut:

>>> df.set_index('ID').T.to_dict('list')
{'p': [1, 3, 2], 'q': [4, 3, 2], 'r': [4, 0, 9]}

Jika diperlukan format kamus yang berbeda, berikut adalah contoh argumen yang mungkin berorientasi. Pertimbangkan DataFrame sederhana berikut ini:

>>> df = pd.DataFrame({'a': ['red', 'yellow', 'blue'], 'b': [0.5, 0.25, 0.125]})
>>> df
        a      b
0     red  0.500
1  yellow  0.250
2    blue  0.125

Maka opsinya adalah sebagai berikut.

dict - default: nama kolom adalah kunci, nilainya kamus dari pasangan indeks:

>>> df.to_dict('dict')
{'a': {0: 'red', 1: 'yellow', 2: 'blue'}, 
 'b': {0: 0.5, 1: 0.25, 2: 0.125}}

daftar - kunci adalah nama kolom, nilai adalah daftar data kolom

>>> df.to_dict('list')
{'a': ['red', 'yellow', 'blue'], 
 'b': [0.5, 0.25, 0.125]}

'daftar' seperti seri , tetapi nilainya Seri

>>> df.to_dict('series')
{'a': 0       red
      1    yellow
      2      blue
      Name: a, dtype: object, 

 'b': 0    0.500
      1    0.250
      2    0.125
      Name: b, dtype: float64}

split -split kolom / data / indeks sebagai kunci dengan nilai-nilai menjadi nama kolom, nilai data menurut baris dan label indeks masing-masing

>>> df.to_dict('split')
{'columns': ['a', 'b'],
 'data': [['red', 0.5], ['yellow', 0.25], ['blue', 0.125]],
 'index': [0, 1, 2]}

catatan - setiap baris menjadi kamus di mana kuncinya adalah nama kolom dan nilai adalah data di dalam sel

>>> df.to_dict('records')
[{'a': 'red', 'b': 0.5}, 
 {'a': 'yellow', 'b': 0.25}, 
 {'a': 'blue', 'b': 0.125}]

indeks - seperti 'catatan', tetapi kamus kamus dengan kunci sebagai label indeks (bukan daftar)

>>> df.to_dict('index')
{0: {'a': 'red', 'b': 0.5},
 1: {'a': 'yellow', 'b': 0.25},
 2: {'a': 'blue', 'b': 0.125}}

14
ini akan menjadi satu liner:df.set_index('ID').T.to_dict('list')
Anzel

1
Untuk satu catatan di Frame Data. df.T.to_dict () [0]
kamran kausar

23

Coba gunakan Zip

df = pd.read_csv("file")
d= dict([(i,[a,b,c ]) for i, a,b,c in zip(df.ID, df.A,df.B,df.C)])
print d

Keluaran:

{'p': [1, 3, 2], 'q': [4, 3, 2], 'r': [4, 0, 9]}

21

Ikuti langkah ini:

Misalkan dataframe Anda adalah sebagai berikut:

>>> df
   A  B  C ID
0  1  3  2  p
1  4  3  2  q
2  4  0  9  r

1. Gunakan set_indexuntuk mengatur IDkolom sebagai indeks dataframe.

    df.set_index("ID", drop=True, inplace=True)

2. Gunakan orient=indexparameter untuk memiliki indeks sebagai kunci kamus.

    dictionary = df.to_dict(orient="index")

Hasilnya adalah sebagai berikut:

    >>> dictionary
    {'q': {'A': 4, 'B': 3, 'D': 2}, 'p': {'A': 1, 'B': 3, 'D': 2}, 'r': {'A': 4, 'B': 0, 'D': 9}}

3. Jika Anda perlu memiliki setiap sampel sebagai daftar jalankan kode berikut. Tentukan urutan kolom

column_order= ["A", "B", "C"] #  Determine your preferred order of columns
d = {} #  Initialize the new dictionary as an empty dictionary
for k in dictionary:
    d[k] = [dictionary[k][column_name] for column_name in column_order]

2
Untuk bit terakhir tampaknya Anda akan lebih mudah menggunakan pemahaman dict untuk mengganti for loop + daftar pemahaman (3 baris -> 1). Either way, meskipun senang memiliki opsi, jawaban teratas jauh lebih pendek.
fantabolous

Ini berguna karena menjelaskan dengan jelas bagaimana menggunakan kolom atau header tertentu sebagai indeks.
Tropicalrambler

10

Jika Anda tidak keberatan dengan nilai kamus sebagai tupel, Anda dapat menggunakannya untuk:

>>> {x[0]: x[1:] for x in df.itertuples(index=False)}
{'p': (1, 3, 2), 'q': (4, 3, 2), 'r': (4, 0, 9)}

7

seharusnya kamus seperti:

{'red': '0.500', 'yellow': '0.250, 'blue': '0.125'}

diperlukan dari kerangka data seperti:

        a      b
0     red  0.500
1  yellow  0.250
2    blue  0.125

Cara paling sederhana adalah dengan melakukan:

dict(df.values.tolist())

cuplikan kerja di bawah ini:

import pandas as pd
df = pd.DataFrame({'a': ['red', 'yellow', 'blue'], 'b': [0.5, 0.25, 0.125]})
dict(df.values.tolist())

masukkan deskripsi gambar di sini


2

Untuk saya gunakan (nama simpul dengan posisi xy) saya menemukan jawaban @ user4179775 untuk yang paling bermanfaat / intuitif:

import pandas as pd

df = pd.read_csv('glycolysis_nodes_xy.tsv', sep='\t')

df.head()
    nodes    x    y
0  c00033  146  958
1  c00031  601  195
...

xy_dict_list=dict([(i,[a,b]) for i, a,b in zip(df.nodes, df.x,df.y)])

xy_dict_list
{'c00022': [483, 868],
 'c00024': [146, 868],
 ... }

xy_dict_tuples=dict([(i,(a,b)) for i, a,b in zip(df.nodes, df.x,df.y)])

xy_dict_tuples
{'c00022': (483, 868),
 'c00024': (146, 868),
 ... }

Tambahan

Saya kemudian kembali ke masalah ini, untuk pekerjaan lain, tetapi terkait,. Berikut adalah pendekatan yang lebih dekat mencerminkan jawaban yang diterima [luar biasa].

node_df = pd.read_csv('node_prop-glycolysis_tca-from_pg.tsv', sep='\t')

node_df.head()
   node  kegg_id kegg_cid            name  wt  vis
0  22    22       c00022   pyruvate        1   1
1  24    24       c00024   acetyl-CoA      1   1
...

Konversi bingkai data Pandas ke [daftar], {dict}, {dict of {dict}}, ...

Per jawaban yang diterima:

node_df.set_index('kegg_cid').T.to_dict('list')

{'c00022': [22, 22, 'pyruvate', 1, 1],
 'c00024': [24, 24, 'acetyl-CoA', 1, 1],
 ... }

node_df.set_index('kegg_cid').T.to_dict('dict')

{'c00022': {'kegg_id': 22, 'name': 'pyruvate', 'node': 22, 'vis': 1, 'wt': 1},
 'c00024': {'kegg_id': 24, 'name': 'acetyl-CoA', 'node': 24, 'vis': 1, 'wt': 1},
 ... }

Dalam kasus saya, saya ingin melakukan hal yang sama tetapi dengan kolom yang dipilih dari kerangka data Pandas, jadi saya perlu mengiris kolom. Ada dua pendekatan.

  1. Langsung:

(lihat: Konversi panda ke kamus dengan mendefinisikan kolom yang digunakan untuk nilai-nilai kunci )

node_df.set_index('kegg_cid')[['name', 'wt', 'vis']].T.to_dict('dict')

{'c00022': {'name': 'pyruvate', 'vis': 1, 'wt': 1},
 'c00024': {'name': 'acetyl-CoA', 'vis': 1, 'wt': 1},
 ... }
  1. "Tidak langsung:" pertama, iris kolom / data yang diinginkan dari kerangka data Pandas (sekali lagi, dua pendekatan),
node_df_sliced = node_df[['kegg_cid', 'name', 'wt', 'vis']]

atau

node_df_sliced2 = node_df.loc[:, ['kegg_cid', 'name', 'wt', 'vis']]

yang kemudian dapat digunakan untuk membuat kamus kamus

node_df_sliced.set_index('kegg_cid').T.to_dict('dict')

{'c00022': {'name': 'pyruvate', 'vis': 1, 'wt': 1},
 'c00024': {'name': 'acetyl-CoA', 'vis': 1, 'wt': 1},
 ... }

-1

DataFrame.to_dict() mengkonversi DataFrame ke kamus.

Contoh

>>> df = pd.DataFrame(
    {'col1': [1, 2], 'col2': [0.5, 0.75]}, index=['a', 'b'])
>>> df
   col1  col2
a     1   0.1
b     2   0.2
>>> df.to_dict()
{'col1': {'a': 1, 'b': 2}, 'col2': {'a': 0.5, 'b': 0.75}}

Lihat Dokumentasi ini untuk detailnya


2
Ya, tetapi OP secara eksplisit menyatakan mereka ingin indeks baris menjadi kunci, bukan label kolom.
Vicki B
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.