Chuyển đổi một DataFrame Pandas thành một từ điển


168

Tôi có một DataFrame với bốn cột. Tôi muốn chuyển đổi DataFrame này thành một từ điển python. Tôi muốn các phần tử của cột đầu tiên là keysvà các phần tử của các cột khác trong cùng một hàng values.

Khung dữ liệu:

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

Đầu ra nên như thế này:

Từ điển:

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

4
Dataframe.to_dict()?
Anzel

3
Dataframe.to_dict()sẽ làm A,B,Cchìa khóa thay vìp,q,r
Hoàng tử Bhatti

@jezrael làm thế nào để có được đầu ra sau đây? {2: {'p': [1,3]}, 2: {'q': [4,3]}, 9: {'r': [4,0]}} cho cùng một tập dữ liệu?
gấu trúc

cột tương đương @jezrael của câu hỏi trên {'c': {'ID': 'A', 'B'}}
gấu trúc

Câu trả lời:


337

Các to_dict()phương pháp đặt tên cột như các phím từ điển, do đó bạn sẽ cần phải định hình lại DataFrame của bạn một chút. Đặt cột 'ID' làm chỉ mục và sau đó hoán chuyển DataFrame là một cách để đạt được điều này.

to_dict()cũng chấp nhận một đối số 'direction' mà bạn sẽ cần để đưa ra danh sách các giá trị cho mỗi cột. Nếu không, một từ điển của biểu mẫu {index: value}sẽ được trả lại cho mỗi cột.

Các bước này có thể được thực hiện với dòng sau:

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

Trong trường hợp cần một định dạng từ điển khác, đây là ví dụ về các đối số định hướng có thể. Hãy xem xét các DataFrame đơn giản sau:

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

Sau đó, các tùy chọn như sau.

dict - mặc định: tên cột là khóa, giá trị là từ điển của chỉ mục: cặp dữ liệu

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

danh sách - khóa là tên cột, giá trị là danh sách dữ liệu cột

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

loạt - như 'danh sách', nhưng giá trị là Sê-ri

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

chia - tách cột / dữ liệu / chỉ mục làm khóa với các giá trị là tên cột, giá trị dữ liệu theo nhãn hàng và chỉ mục tương ứng

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

bản ghi - mỗi hàng trở thành một từ điển trong đó khóa là tên cột và giá trị là dữ liệu trong ô

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

chỉ mục - như 'bản ghi', nhưng một từ điển từ điển với các khóa làm nhãn chỉ mục (thay vì danh sách)

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

14
đây sẽ là một lớp lót:df.set_index('ID').T.to_dict('list')
Anzel

1
Đối với một bản ghi trong Khung dữ liệu. df.T.to_dict () [0]
kamran kausar

23

Thử sử dụng 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

Đầu ra:

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

21

Thực hiện theo các bước sau:

Giả sử khung dữ liệu của bạn như sau:

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

1. Sử dụng set_indexđể đặt IDcác cột làm chỉ mục khung dữ liệu.

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

2. Sử dụng orient=indextham số để có chỉ mục làm khóa từ điển.

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

Kết quả sẽ như sau:

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

3. Nếu bạn cần có mỗi mẫu dưới dạng một danh sách, hãy chạy đoạn mã sau. Xác định thứ tự cột

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
Đối với bit cuối cùng có vẻ như bạn sẽ đơn giản hơn bằng cách sử dụng một cách hiểu chính tả để thay thế cho vòng lặp for + hiểu danh sách (3 dòng -> 1). Dù bằng cách nào, mặc dù thật tuyệt khi có các tùy chọn, câu trả lời hàng đầu ngắn hơn rất nhiều.
tưởng tượng

Điều này rất hữu ích vì nó giải thích rõ ràng cách sử dụng một cột hoặc tiêu đề cụ thể làm chỉ mục.
Tropicalrambler

10

Nếu bạn không nhớ các giá trị từ điển là bộ dữ liệu, bạn có thể sử dụng itertuples:

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

7

một từ điển như:

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

được yêu cầu ra khỏi một khung dữ liệu như:

        a      b
0     red  0.500
1  yellow  0.250
2    blue  0.125

cách đơn giản nhất sẽ là:

dict(df.values.tolist())

đoạn làm việc dưới đây:

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

nhập mô tả hình ảnh ở đây


2

Để sử dụng (tên nút với vị trí xy) tôi đã tìm thấy câu trả lời của @ user4179775 cho hữu ích / trực quan nhất:

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

Phụ lục

Sau đó tôi trở lại vấn đề này, cho công việc khác, nhưng có liên quan. Đây là một cách tiếp cận phản ánh chặt chẽ hơn câu trả lời được chấp nhận [xuất sắc].

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

Chuyển đổi khung dữ liệu Pandas thành [danh sách], {dict}, {dict của {dict}}, ...

Mỗi câu trả lời được chấp nhận:

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

Trong trường hợp của tôi, tôi muốn làm điều tương tự nhưng với các cột được chọn từ khung dữ liệu Pandas, vì vậy tôi cần phải cắt các cột. Có hai cách tiếp cận.

  1. Trực tiếp:

(xem: Chuyển đổi gấu trúc thành từ điển xác định các cột được sử dụng cho các giá trị chính )

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. "Gián tiếp:" trước tiên, hãy cắt các cột / dữ liệu mong muốn từ khung dữ liệu Pandas (một lần nữa, hai cách tiếp cận),
node_df_sliced = node_df[['kegg_cid', 'name', 'wt', 'vis']]

hoặc là

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

sau đó có thể được sử dụng để tạo ra một từ điển từ điển

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() chuyển đổi DataFrame thành từ điển.

Thí dụ

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

Xem Tài liệu này để biết chi tiết


2
Có, nhưng OP Rõ ràng tuyên bố họ muốn các chỉ mục hàng là khóa, không phải nhãn cột.
Vicki B
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.