python pandas数据框到字典
Posted
技术标签:
【中文标题】python pandas数据框到字典【英文标题】:python pandas dataframe to dictionary 【发布时间】:2013-09-12 18:53:13 【问题描述】:我有一个两列数据框,并打算将其转换为 python 字典 - 第一列将是键,第二列将是值。先感谢您。
数据框:
id value
0 0 10.2
1 1 5.7
2 2 7.4
【问题讨论】:
可能重复:***.com/questions/18012505/… 你检查过这个吗?:pandas.pydata.org/pandas-docs/dev/generated/… @perigee:您能否接受其中一个答案(如果有帮助)以将问题标记为已解决?这也会帮助其他用户。 如果您有一个与索引匹配的 id,您应该将其设置为索引。 【参考方案1】:如果你设置索引比字典会产生唯一的键值对
encoder=LabelEncoder()
df['airline_enc']=encoder.fit_transform(df['airline'])
dictAirline= df[['airline_enc','airline']].set_index('airline_enc').to_dict()
【讨论】:
【参考方案2】:我在尝试使用 pandas 数据框的 三 列制作字典时发现了这个问题。在我的情况下,数据框有 A、B 和 C 列(假设 A 和 B 是经度和纬度的地理坐标,C 是国家/地区/州/等,或多或少是这种情况)。
我想要一个字典,其中每对 A、B 值(字典键)与相应行中的 C 值(字典值)匹配(保证 A、B 值的每个 pair由于之前的过滤而唯一,但在这种情况下,对于不同的 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 年的快速双核笔记本电脑上不到一秒)。
我发这个的原因:
-
对于那些需要这种解决方案的人
如果有人知道执行速度更快的解决方案(例如,对于数百万行),我将不胜感激。
【讨论】:
【参考方案3】:这是我的解决方案:
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)
【讨论】:
【参考方案4】: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,一个基本循环
【讨论】:
【参考方案5】:最简单的解决方案:
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
是什么意思?
@mingchau records
这里的意思是‘records’ : list like [column -> value, … , column -> value]
见pandas.pydata.org/pandas-docs/stable/reference/api/…【参考方案6】:
你可以使用'dict理解'
my_dict = row[0]: row[1] for row in df.values
【讨论】:
在内存使用方面,使用 pandas 循环并不是最有效的。见:engineering.upside.com/… OP 没有要求最有效的答案,所以我认为@Dongwan Kim 提供了不错的替代解决方案。【参考方案7】:您需要一个列表作为字典值。这段代码可以解决问题。
from collections import defaultdict
mydict = defaultdict(list)
for k, v in zip(df.id.values,df.value.values):
mydict[k].append(v)
【讨论】:
【参考方案8】:在某些版本中,下面的代码可能不起作用
mydict = dict(zip(df.id, df.value))
所以说清楚
id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))
注意我用id_是因为id是保留字
【讨论】:
同意,它对我不起作用。但是df.id
怎么办呢,列名id
是不被识别为数据框变量的吧?如,写入数据框对象库的变量。我一定是误会了什么。【参考方案9】:
另一个(略短)不丢失重复条目的解决方案:
>>> 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]
【讨论】:
【参考方案10】:mydict = dict(zip(df.id, df.value))
【讨论】:
注意:如果索引是所需的字典键,则执行:dict(zip(df.index,df.value))【参考方案11】:请参阅to_dict
的文档。你可以这样使用它:
df.set_index('id').to_dict()
如果你只有一列,避免列名也是dict中的一个级别(实际上,在这种情况下你使用Series.to_dict()
):
df.set_index('id')['value'].to_dict()
【讨论】:
请注意,如果ID列中存在冗余值,此命令将丢失数据:>>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) >>> ptest.set_index('id')['value'].to_dict()
我不得不说,该文档链接中没有任何内容可以为我提供这个问题的答案。
@bombayquant 请参阅下面的 DSM 和我的答案。请注意,这是一个 4 年前的讨论。【参考方案12】:
如果您想要一种简单的方法来保留重复项,您可以使用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]
【讨论】:
漂亮而优雅的解决方案,但是在 50k 行的表上,它比我下面的丑陋解决方案慢了大约 6 倍。 @dallologm:你能举一个例子表吗?如果它比 Python 循环慢六倍,那么 pandas 中可能存在性能错误。【参考方案13】:joris 在这个线程中的答案和punchagan 在duplicated thread 中的答案非常优雅,但是如果用于键的列包含任何重复值,它们将不会给出正确的结果。
例如:
>>> 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]
【讨论】:
由于cmets中缺少块,请原谅格式化:mydict = defaultdict(list)\n for (key, val) in ptest[["id", "value"]].itertuples(index=False):\n mydict[key].append(val)
虽然不像单线那么优雅,但我更喜欢你的解决方案。以上是关于python pandas数据框到字典的主要内容,如果未能解决你的问题,请参考以下文章
从 pandas 数据框到元组(对于 hasrsine 模块)