我有一个两列数据框,并打算将其转换为 python 字典 - 第一列将是键,第二列将是值。先感谢您。
数据框:
id value
0 0 10.2
1 1 5.7
2 2 7.4
我有一个两列数据框,并打算将其转换为 python 字典 - 第一列将是键,第二列将是值。先感谢您。
数据框:
id value
0 0 10.2
1 1 5.7
2 2 7.4
请参阅to_dict
. 你可以像这样使用它:
df.set_index('id').to_dict()
如果你只有一列,为了避免列名也是字典中的一个级别(实际上,在这种情况下你使用Series.to_dict()
):
df.set_index('id')['value'].to_dict()
mydict = dict(zip(df.id, df.value))
如果您想要一种简单的方法来保留重复项,您可以使用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]}
此线程中的 joris 和重复线程中的 pengagan 的答案非常优雅,但是如果用于键的列包含任何重复值,它们将不会给出正确的结果。
例如:
>>> 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]}
最简单的解决方案:
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')
您可以使用“听写理解”
my_dict = {row[0]: row[1] for row in df.values}
在某些版本中,下面的代码可能不起作用
mydict = dict(zip(df.id, df.value))
所以说清楚
id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))
注意我使用了 id_ 因为单词 id 是保留字
我在尝试用 pandas 数据框的三列制作字典时发现了这个问题。在我的情况下,数据框有 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 列均未用作索引)
两种方法都很快(在 85k 行的数据帧上不到一秒,5 年前的快速双核笔记本电脑)。
我发这个的原因:
另一个(略短)不丢失重复条目的解决方案:
>>> 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]}
您需要一个列表作为字典值。这段代码可以解决问题。
from collections import defaultdict
mydict = defaultdict(list)
for k, v in zip(df.id.values,df.value.values):
mydict[k].append(v)
如果您设置索引比字典将导致唯一的键值对
encoder=LabelEncoder()
df['airline_enc']=encoder.fit_transform(df['airline'])
dictAirline= df[['airline_enc','airline']].set_index('airline_enc').to_dict()
这是我的解决方案:
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)
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,一个基本的循环