150

我有一个两列数据框,并打算将其转换为 python 字典 - 第一列将是键,第二列将是值。先感谢您。

数据框:

    id    value
0    0     10.2
1    1      5.7
2    2      7.4
4

13 回答 13

194

请参阅to_dict. 你可以像这样使用它:

df.set_index('id').to_dict()

如果你只有一列,为了避免列名也是字典中的一个级别(实际上,在这种情况下你使用Series.to_dict()):

df.set_index('id')['value'].to_dict()
于 2013-09-09T09:55:13.047 回答
89
mydict = dict(zip(df.id, df.value))
于 2016-10-03T17:41:02.203 回答
54

如果您想要一种简单的方法来保留重复项,您可以使用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]}
于 2014-06-23T16:08:36.923 回答
32

此线程中的 joris 和重复线程中的 pengagan 的答案非常优雅,但是如果用于键的列包含任何重复值,它们将不会给出正确的结果。

例如:

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

如果您有重复的条目并且不想丢失它们,您可以使用这个丑陋但有效的代码:

>>> 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]}
于 2014-06-23T14:35:48.740 回答
14

最简单的解决方案:

df.set_index('id').T.to_dict('records')

例子:

df= pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
df.set_index('id').T.to_dict('records')

如果您有多个值,例如 val1、val2、val3 等,并且您希望它们作为列表,请使用以下代码:

df.set_index('id').T.to_dict('list')
于 2019-03-06T19:58:54.697 回答
12

您可以使用“听写理解”

my_dict = {row[0]: row[1] for row in df.values}
于 2018-09-14T07:06:08.037 回答
9

在某些版本中,下面的代码可能不起作用

mydict = dict(zip(df.id, df.value))

所以说清楚

id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))

注意我使用了 id_ 因为单词 id 是保留字

于 2018-01-05T00:16:39.507 回答
6

我在尝试用 pandas 数据框的三列制作字典时发现了这个问题。在我的情况下,数据框有 A、B 和 C 列(假设 A 和 B 是经度和纬度的地理坐标,C 是国家地区/州/等,或多或少是这种情况)。

我想要一个字典,其中每对 A,B 值(字典键)与相应行中的 C 值(字典值)匹配(由于先前的过滤,每A,B 值保证是唯一的,但它是在这种情况下,对于不同的 A、B 值对可能具有相同的 C 值),所以我这样做了:

mydict = dict(zip(zip(df['A'],df['B']), df['C']))

使用 pandas to_dict()也可以:

mydict = df.set_index(['A','B']).to_dict(orient='dict')['C']

(在执行创建字典的行之前,A 或 B 列均未用作索引)

两种方法都很快(在 85k 行的数据帧上不到一秒,5 年前的快速双核笔记本电脑)。

我发这个的原因:

  1. 对于那些需要这种解决方案的人
  2. 如果有人知道更快执行的解决方案(例如,数百万行),我将不胜感激。
于 2020-04-28T12:22:14.067 回答
3

另一个(略短)不丢失重复条目的解决方案:

>>> 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]}
于 2017-10-23T16:29:10.307 回答
1

您需要一个列表作为字典值。这段代码可以解决问题。

from collections import defaultdict
mydict = defaultdict(list)
for k, v in zip(df.id.values,df.value.values):
    mydict[k].append(v)
于 2018-01-18T00:07:57.700 回答
1

如果您设置索引比字典将导致唯一的键值对

encoder=LabelEncoder()
df['airline_enc']=encoder.fit_transform(df['airline'])
dictAirline= df[['airline_enc','airline']].set_index('airline_enc').to_dict()
于 2021-01-24T15:20:26.720 回答
0

这是我的解决方案:

import pandas as pd
df = pd.read_excel('dic.xlsx')
df_T = df.set_index('id').T
dic = df_T.to_dict('records')
print(dic)
于 2020-04-04T11:39:22.993 回答
0
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

这是我的 sloution,一个基本的循环

于 2020-03-20T02:15:15.873 回答