如何将数据框转换为字典

2025-02-18 09:25:00
admin
原创
80
摘要:问题描述:我有一个包含两列的数据框,我打算将其转换为字典。第一列将是键,第二列将是值。数据框: 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2560  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1552  
  华为IPD研发项目管理在企业的创新与发展中扮演着至关重要的角色,而高效复盘则是确保项目不断优化、持续提升的关键环节。通过合理运用一系列工具,华为能够深入剖析项目过程中的得失,为未来项目提供宝贵经验。以下将详细解析助力华为IPD研发项目管理实现高效复盘的5大工具。项目数据仪表盘项目数据仪表盘是一种直观呈现项目关键数据的工...
华为IPD产品开发流程   0  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Hive、Monday、GanttPRO、QuickBase、Planview、Productive、Plutio、Forecast、Runn。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目成功的关键工具。然而,面对市场上琳琅满...
项目管理软件   1  
  PLM(产品生命周期管理)项目管理对于企业产品的全生命周期管控至关重要,而其中资源分配的优化以及高效团队协作机制的构建更是决定项目成败的关键因素。合理的资源分配能确保项目在预算和时间范围内顺利推进,高效的团队协作机制则能充分发挥团队成员的优势,提升整体项目的执行效率。接下来,我们将深入探讨如何通过四个关键步骤来优化资源...
国产plm软件排名   2  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用