python pandas dataframe to dictionary

per*_*gee 86 python dictionary pandas

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

数据帧:

    id    value
0    0     10.2
1    1      5.7
2    2      7.4
Run Code Online (Sandbox Code Playgroud)

jor*_*ris 127

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

df.set_index('id').to_dict()
Run Code Online (Sandbox Code Playgroud)

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

df.set_index('id')['value'].to_dict()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果ID列中存在冗余值,此命令将丢失数据:`>>> ptest = p.DataFrame([['a',1],['a',2],['b',3] ],columns = ['id','value'])>>> ptest.set_index('id')['value'].to_dict()` (13认同)
  • 我不得不说,该文档链接中没有任何内容可以为我提供这个问题的答案. (6认同)

小智 56

mydict = dict(zip(df.id, df.value))
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果索引是所需的字典键,则执行: dict(zip(df.index,df.value)) (4认同)

DSM*_*DSM 45

如果您想要一种简单的方法来保留重复项,您可以使用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]}
Run Code Online (Sandbox Code Playgroud)

  • 不错且优雅的解决方案,但在 50k 行的表上,它比下面我丑陋的解决方案慢大约 6 倍。 (2认同)

dal*_*ogm 22

joris在这个帖子中和punchagan在重复的线程中的答案非常优雅,但是如果用于键的列包含任何重复的值,它们将不会给出正确的结果.

例如:

>>> 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}
Run Code Online (Sandbox Code Playgroud)

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

>>> 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]}
Run Code Online (Sandbox Code Playgroud)

  • 由于注释中缺少一个块,请原谅格式:`mydict = defaultdict(list)\n for(key,val)in ptest [["id","value"]].itertuples(index = False):\n mydict [key] .append(val)` (2认同)

Gil*_*gio 13

最简单的解决方案:

df.set_index('id').T.to_dict('records')
Run Code Online (Sandbox Code Playgroud)

例子:

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

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

df.set_index('id').T.to_dict('list')
Run Code Online (Sandbox Code Playgroud)


小智 6

在某些版本中,以下代码可能无法正常工作

mydict = dict(zip(df.id, df.value))
Run Code Online (Sandbox Code Playgroud)

所以要明确

id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))
Run Code Online (Sandbox Code Playgroud)

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


小智 6

你可以使用'dict comprehension'

my_dict = {row[0]: row[1] for row in df.values}
Run Code Online (Sandbox Code Playgroud)

  • OP 没有要求最有效的答案,所以我认为 @Dongwan Kim 提供了不错的替代解决方案。 (2认同)

小智 6

下面是一个转换具有列 A、B 和 C 的数据框的示例(假设 A 和 B 是经度和纬度的地理坐标,C 是国家/地区/州/等,或多或少是这样的) 。

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

mydict = dict(zip(zip(df['A'],df['B']), df['C']))
Run Code Online (Sandbox Code Playgroud)

使用 pandas to_dict()也可以:

mydict = df.set_index(['A','B']).to_dict(orient='dict')['C']
Run Code Online (Sandbox Code Playgroud)

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

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