Tôi có một khung dữ liệu hai cột và định chuyển nó thành từ điển python - cột đầu tiên sẽ là khóa và cột thứ hai sẽ là giá trị. Cảm ơn bạn trước.
Khung dữ liệu:
id value
0 0 10.2
1 1 5.7
2 2 7.4
Tôi có một khung dữ liệu hai cột và định chuyển nó thành từ điển python - cột đầu tiên sẽ là khóa và cột thứ hai sẽ là giá trị. Cảm ơn bạn trước.
Khung dữ liệu:
id value
0 0 10.2
1 1 5.7
2 2 7.4
Câu trả lời:
Xem tài liệu cho to_dict
. Bạn có thể sử dụng nó như thế này:
df.set_index('id').to_dict()
Và nếu bạn chỉ có một cột, để tránh tên cột cũng là một cấp trong dict (thực tế, trong trường hợp này, bạn sử dụng Series.to_dict()
):
df.set_index('id')['value'].to_dict()
>>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) >>> ptest.set_index('id')['value'].to_dict()
mydict = dict(zip(df.id, df.value))
Nếu bạn muốn một cách đơn giản để bảo vệ các bản sao, bạn có thể sử dụng groupby
:
>>> ptest = pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value'])
>>> ptest
id value
0 a 1
1 a 2
2 b 3
>>> {k: g["value"].tolist() for k,g in ptest.groupby("id")}
{'a': [1, 2], 'b': [3]}
Các câu trả lời bằng joris trong chuỗi này và bằng punchagan trong chuỗi sao chép rất thanh lịch, tuy nhiên chúng sẽ không cho kết quả chính xác nếu cột được sử dụng cho các khóa chứa bất kỳ giá trị trùng lặp nào.
Ví dụ:
>>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value'])
>>> ptest
id value
0 a 1
1 a 2
2 b 3
# note that in both cases the association a->1 is lost:
>>> ptest.set_index('id')['value'].to_dict()
{'a': 2, 'b': 3}
>>> dict(zip(ptest.id, ptest.value))
{'a': 2, 'b': 3}
Nếu bạn có các mục nhập trùng lặp và không muốn mất chúng, bạn có thể sử dụng mã xấu xí nhưng hoạt động tốt này:
>>> mydict = {}
>>> for x in range(len(ptest)):
... currentid = ptest.iloc[x,0]
... currentvalue = ptest.iloc[x,1]
... mydict.setdefault(currentid, [])
... mydict[currentid].append(currentvalue)
>>> mydict
{'a': [1, 2], 'b': [3]}
mydict = defaultdict(list)\n for (key, val) in ptest[["id", "value"]].itertuples(index=False):\n mydict[key].append(val)
Giải pháp đơn giản nhất:
df.set_index('id').T.to_dict('records')
Thí dụ:
df= pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
df.set_index('id').T.to_dict('records')
Nếu bạn có nhiều giá trị, như val1, val2, val3, v.v. và bạn muốn chúng dưới dạng danh sách, thì hãy sử dụng mã dưới đây:
df.set_index('id').T.to_dict('list')
records
có nghĩa là ở đây?
records
ở đây có nghĩa là ‘records’ : list like [{column -> value}, … , {column -> value}]
Xem pandas.pydata.org/pandas-docs/stable/reference/api/…
trong một số phiên bản mã bên dưới có thể không hoạt động
mydict = dict(zip(df.id, df.value))
vì vậy hãy làm cho nó rõ ràng
id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))
Lưu ý rằng tôi đã sử dụng id_ vì id từ là từ dành riêng
Bạn có thể sử dụng 'đọc hiểu chính tả'
my_dict = {row[0]: row[1] for row in df.values}
Một giải pháp khác (ngắn hơn một chút) để không mất các mục nhập trùng lặp:
>>> ptest = pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
>>> ptest
id value
0 a 1
1 a 2
2 b 3
>>> pdict = dict()
>>> for i in ptest['id'].unique().tolist():
... ptest_slice = ptest[ptest['id'] == i]
... pdict[i] = ptest_slice['value'].tolist()
...
>>> pdict
{'b': [3], 'a': [1, 2]}
Tôi đã tìm thấy câu hỏi này trong khi cố gắng tạo một từ điển từ ba cột của khung dữ liệu gấu trúc. Trong trường hợp của tôi, khung dữ liệu có các cột A, B và C (giả sử A và B là tọa độ địa lý của kinh độ và vĩ độ và C là vùng / tiểu bang / v.v. của quốc gia, ít nhiều là như vậy).
Tôi muốn có một từ điển với mỗi cặp giá trị A, B (khóa từ điển) khớp với giá trị của C (giá trị từ điển) trong hàng tương ứng (mỗi cặp giá trị A, B được đảm bảo là duy nhất do lọc trước đó, nhưng nó là có thể có cùng giá trị C cho các cặp giá trị A, B khác nhau trong ngữ cảnh này), vì vậy tôi đã làm:
mydict = dict(zip(zip(df['A'],df['B']), df['C']))
Sử dụng pandas to_dict () cũng hoạt động:
mydict = df.set_index(['A','B']).to_dict(orient='dict')['C']
(không có cột A hoặc B nào được sử dụng làm chỉ mục trước khi thực hiện dòng tạo từ điển)
Cả hai cách tiếp cận đều nhanh (chưa đầy một giây trên khung dữ liệu với 85 nghìn hàng, máy tính xách tay lõi kép nhanh 5 năm tuổi).
Lý do tôi đăng bài này:
def get_dict_from_pd(df, key_col, row_col):
result = dict()
for i in set(df[key_col].values):
is_i = df[key_col] == i
result[i] = list(df[is_i][row_col].values)
return result
đây là sự lười biếng của tôi, một vòng lặp cơ bản