如何将数据框转换为字典

2025-02-18 09:25:00
admin
原创
70
摘要:问题描述:我有一个包含两列的数据框,我打算将其转换为字典。第一列将是键,第二列将是值。数据框: id value 0 0 10.2 1 1 5.7 2 2 7.4 我怎样才能做到这一点?解决方案 1:如果lakes是你的DataFrame,你可以做类似...

问题描述:

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

数据框:

    id    value
0    0     10.2
1    1      5.7
2    2      7.4

我怎样才能做到这一点?


解决方案 1:

如果lakes是你的DataFrame,你可以做类似的事情

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

解决方案 2:

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

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

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

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

解决方案 3:

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

解决方案 4:

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

解决方案 5:

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

解决方案 6:

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

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

解决方案 7:

您可以使用“字典理解”

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

解决方案 8:

使用 pandas 可以这样做:

如果 lakes 是你的 DataFrame:

area_dict = lakes.to_dict('records')

解决方案 9:

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

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

所以要明确

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

注意我使用 id_ 因为 id 这个词是保留字

解决方案 10:

下面是一个转换具有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 列均未被用作索引)

两种方法都很快(在~2015 快速双核笔记本电脑上,处理 85k 行的数据框所需的时间不到一秒)。

解决方案 11:

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

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

解决方案 12:

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

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

解决方案 13:

如果“lakes”是您的数据框,您可以执行以下操作:

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

两者都应该有效。

解决方案 14:

你需要这个

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

解决方案 15:

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

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

解决方案 16:

如果设置索引,那么字典将产生唯一的键值对

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

解决方案 17:

这里的许多答案都使用了dict(zip(...))语法。没有也是可能的zip

mydict = dict(df.values)                        # {0.0: 10.2, 1.0: 5.7, 2.0: 7.4}
# or for faster code, convert to a list
mydict = dict(df.values.tolist())               # {0.0: 10.2, 1.0: 5.7, 2.0: 7.4}

如果一列是int而另一列与floatOP中一样,则转换为objectdtype并调用dict()

mydict = dict(df.astype('O').values)            # {0: 10.2, 1: 5.7, 2: 7.4}
mydict = dict(df.astype('O').values.tolist())   # {0: 10.2, 1: 5.7, 2: 7.4}

如果索引就是键,那就更简单了。

mydict = df['value'].to_dict()                  # {0: 10.2, 1: 5.7, 2: 7.4}

解决方案 18:

编辑

通过以下方式可以达到相同的结果:

filter_list = df[df.Col.isin(criteria)][['Col1','Col2']].values.tolist()

原始帖子

我遇到了类似的问题,我希望将数据框过滤到结果列表列表中。

这是我的解决方案:

filter_df = df[df.Col.isin(criteria)][['Col1','Col2']]
filter_list = filter_df.to_dict(orient='tight')
filter_list = filter_list['data']

结果:列表的列表

来源:pandas.DataFrame.to_dict

解决方案 19:

如果值列中存在一些重复的值,并且我们想将重复的值保留在字典中

下面的代码可以帮助

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

解决方案 20:

以下是创建包含多行信息的字典的方法。首先将我们要用作键的列设置为索引,然后转置并将数据框转换为字典。转置后,键列变为列名,所有其他特征变为每列的值。

df.set_index('key_col', inplace=True)
dct = df.T.to_dict()

解决方案 21:

这是我的解决方案:

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)

解决方案 22:

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

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2079  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1459  
  建筑行业正处于数字化转型的关键时期,建筑产品生命周期管理(PLM)系统的实施对于提升项目效率、质量和协同性至关重要。特别是在 2025 年,基于建筑信息模型(BIM)的项目进度优化工具成为众多建筑企业关注的焦点。这些工具不仅能够整合项目全生命周期的数据,还能通过精准的分析和模拟,为项目进度管理提供强大支持。BIM 与建...
plm是什么软件   0  
  PLM系统开发的重要性与现状PLM(产品生命周期管理)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它贯穿产品从概念设计到退役的整个生命周期,整合了产品数据、流程以及人员等多方面的资源,极大地提高了企业的协同效率和创新能力。通过PLM系统,企业能够实现产品信息的集中管理与共享,不同部门之间可以实时获取...
国产plm软件   0  
  PLM(产品生命周期管理)系统在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和技术的飞速发展,企业对PLM系统的迭代周期优化需求日益迫切。2025年敏捷认证对项目管理提出了新的要求,其中燃尽图作为一种强大的可视化工具,在PLM系统迭代周期优化中有着广泛且重要的应用。深入探讨这些应用,对于提升企业的项...
plm系统主要干什么的   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用