Panda DataFrame'i sözlüğe dönüştürme


169

Dört sütun ile bir DataFrame var. Bu DataFrame'i bir python sözlüğüne dönüştürmek istiyorum. İlk sütunun öğelerinin olmasını keysve aynı satırdaki diğer sütunların öğelerinin olmasını istiyorum values.

Veri çerçevesi:

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

Çıktı şu şekilde olmalıdır:

Sözlük:

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

4
Dataframe.to_dict()?
Anzel

3
Dataframe.to_dict()A,B,Canahtarlar yerine yapacakp,q,r
Prince Bhatti

@jezrael aşağıdaki çıktıyı nasıl alabilirim? {2: {'p': [1,3]}, 2: {'q': [4,3]}, 9: {'r': [4,0]}} aynı veri kümesi için mi?
panda

Yukarıdaki sorunun {@ c ': {' ID ':' A ',' B '}}
panda

Yanıtlar:


339

to_dict()Eğer hafifçe DataFrame yeniden şekillendirmek gerekir böylece yöntem sözlük tuşları olarak sütun adlarını belirler. 'ID' sütununu dizin olarak ayarlamak ve daha sonra DataFrame'i aktarmak bunu başarmanın yollarından biridir.

to_dict()ayrıca her sütun için bir değer listesi çıktısı almak için ihtiyaç duyacağınız bir 'yönlendir' argümanını da kabul eder . Aksi takdirde, {index: value}her sütun için formun bir sözlüğü döndürülür.

Bu adımlar aşağıdaki satırla yapılabilir:

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

Farklı bir sözlük formatı gerektiğinde, olası yönlendirme argümanlarına örnekler verilmiştir. Aşağıdaki basit DataFrame'i düşünün:

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

Sonra seçenekler aşağıdaki gibidir.

dict - varsayılan: sütun adları anahtarlardır, değerler indeksin sözlükleridir: veri çiftleri

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

list - anahtarlar sütun adlarıdır, değerler sütun verilerinin listeleridir

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

dizi - benzeri 'liste', ancak değerler 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 - sütunları / verileri / dizini anahtarlar olarak böler; değerleri sırasıyla sütun adları, veri değerleri sırasıyla satır ve dizin etiketleri

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

kayıtlar - her satır, anahtarın sütun adı ve değerin hücredeki veri olduğu bir sözlük haline gelir

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

dizin benzeri 'kayıtlar', ancak anahtarları dizin etiketi olarak içeren sözlüklerin sözlüğü (bir liste yerine)

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

15
bu bir astar olacak:df.set_index('ID').T.to_dict('list')
Anzel

1
Veri Çerçevesi'ndeki bir kayıt için. df.T.to_dict () [0]
kamran kausar

23

Kullanmaya çalışmak 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

Çıktı:

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

21

Bu adımları takip et:

Veri çerçevenizin aşağıdaki gibi olduğunu varsayalım:

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

1. Sütunları veri çerçevesi dizini olarak set_indexayarlamak IDiçin düğmelerini kullanın .

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

2. orient=indexDizini sözlük anahtarları olarak almak için parametreyi kullanın.

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

Sonuçlar aşağıdaki gibi olacaktır:

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

3. Her numuneyi liste olarak almanız gerekiyorsa aşağıdaki kodu çalıştırın. Sütun sırasını belirleme

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
Son bit için for döngüsü + liste kavrama (3 satır -> 1) yerine bir diksiyon kavrama kullanarak daha basit olurdu görünüyor. Her iki durumda da, seçeneklere sahip olmak güzel olsa da, en iyi cevap çok daha kısadır.
fevkalade

Bu, kullanışlıdır, çünkü belirli bir sütunun veya başlığın dizin olarak nasıl kullanılacağını açık bir şekilde açıklar.
Tropicalrambler

10

Sözlük değerlerinin tuples olduğunu düşünmezseniz, itertuples'ı kullanabilirsiniz:

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

8

şöyle bir sözlük olmalı:

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

aşağıdaki gibi bir veri çerçevesinden istenmelidir:

        a      b
0     red  0.500
1  yellow  0.250
2    blue  0.125

yapmanın en basit yolu:

dict(df.values.tolist())

aşağıda çalışma snippet'i:

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

resim açıklamasını buraya girin


2

Kullanımım için (xy konumlu düğüm adları) @ user4179775'in en yararlı / sezgisel yanıtı buldum:

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),
 ... }

ek

Daha sonra bu konuya, ancak diğer ilgili işler için geri döndüm. İşte [mükemmel] kabul edilen cevabı daha yakından yansıtan bir yaklaşım.

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
...

Panda veri çerçevesini [list], {dict}, {dict} dict}} biçimine dönüştürün ...

Kabul edilen cevap başına:

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},
 ... }

Benim durumumda, aynı şeyi yapmak istedim ama Pandalar veri çerçevesinden seçilen sütunlarla, bu yüzden sütunları dilimlemem gerekiyordu. İki yaklaşım vardır.

  1. Direkt olarak:

(bkz: Pandaları, anahtar değerler için kullanılan sütunları tanımlayarak sözlüğe dönüştürme )

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. "Dolaylı olarak:" önce, Panda sütunları çerçevesinden istenen sütunları / verileri dilimleyin (yine iki yaklaşım),
node_df_sliced = node_df[['kegg_cid', 'name', 'wt', 'vis']]

veya

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

sözlükler sözlüğü oluşturmak için kullanılabilir.

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() DataFrame'i sözlüğe çevirir.

Misal

>>> 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}}

Ayrıntılar için bu Belgelere bakın


2
Evet, ancak OP explicitl, satır dizinlerinin sütun etiketleri değil anahtar olmasını istediğini belirtti.
Vicki B
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.