如何将数据帧转换为字典

我有一个具有两列的数据框架,并打算将其转换为字典。第一列是键,第二列是值。

数据框架:

    id    value
0    0     10.2
1    1      5.7
2    2      7.4

我怎么能这么做?

267549 次浏览

如果 lakes是你的 DataFrame,你可以这样做

area_dict = dict(zip(lakes.id, lakes.value))

查看文档了解 to_dict。你可以这样使用它:

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

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

df.set_index('id')['value'].to_dict()

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}

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

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

如果你想要一个简单的方法来保存副本,你可以使用 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]}
mydict = dict(zip(df.id, df.value))

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

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

在某些版本中,下面的代码可能无法工作

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

那就说清楚点

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

注意 我使用 id _,因为 id 是保留字

您需要一个列表作为字典值。

from collections import defaultdict
mydict = defaultdict(list)
for k, v in zip(df.id.values,df.value.values):
mydict[k].append(v)

对于熊猫,可以这样做:

如果湖泊是你的数据框架:

area_dict = lakes.to_dict('records')

你可以使用“词汇理解”

my_dict = {row[0]: row[1] for row in df.values}

如果你想和熊猫一起玩,你也可以这样做。不过,我喜欢潘查根的方式。

# replicating your dataframe
lake = pd.DataFrame({'co tp': ['DE Lake', 'Forest', 'FR Lake', 'Forest'],
'area': [10, 20, 30, 40],
'count': [7, 5, 2, 3]})
lake.set_index('co tp', inplace=True)


# to get key value using pandas
area_dict = lake.set_index('area').T.to_dict('records')[0]
print(area_dict)


output: {10: 7, 20: 5, 30: 2, 40: 3}

这是我认为最简单的解决方案:

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

从这里阅读更多关于 records的信息: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_dict.html

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

这是我的解决方案,一个基本的循环。

这是我的解决办法:

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)

下面是一个转换数据框架的例子,其中包含 列 a、 b 和 c (假设 a 和 b 是经纬度的经纬度,c 是国家地区/国家/等等,这或多或少是这种情况)。

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

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

使用大熊猫 来决定()也有效:

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

(在执行创建字典的行之前,没有一个列 A 或 B 用作索引)

这两种方法都很快(在一个有85k 行的数据框架上,在一台2015年的快速双核笔记本电脑上,不到一秒钟)。

如果设置索引,则 dictionary 将生成唯一的键值对

encoder=LabelEncoder()
df['airline_enc']=encoder.fit_transform(df['airline'])
dictAirline= df[['airline_enc','airline']].set_index('airline_enc').to_dict()

如果湖泊是你的数据框架,你可以 还有这样做:

# Your dataframe
lakes = pd.DataFrame({'co tp': ['DE Lake', 'Forest', 'FR Lake', 'Forest'],
'area': [10, 20, 30, 40],
'count': [7, 5, 2, 3]})
lakes.set_index('co tp', inplace=True)

我的解决办法是:

area_dict = lakes.set_index("area")["count"].to_dict()

或@Punchagan 的解决方案(我更喜欢这个)

area_dict = dict(zip(lakes.area, lakes.count))

两个都可以。

你需要这个

area_dict = lakes.to_dict(orient='records')

如果值列中存在重复值,并且我们希望将重复值保存在字典中

以下代码可能会有帮助

df = pd.DataFrame([['a',1],['a',2],['a',4],['b',3],['b',4],['c',5]], columns=['id', 'value'])


df.groupby('id')['value'].apply(list).to_dict()


output : {'a': [1, 2, 4], 'b': [3, 4], 'c': [5]}