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)
小智 56
mydict = dict(zip(df.id, df.value))
Run Code Online (Sandbox Code Playgroud)
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)
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)
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)
小智 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 行的数据帧上不到一秒)。
归档时间: |
|
查看次数: |
131834 次 |
最近记录: |