如何将数据框转换为字典
- 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
,你可以做类似的事情
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
而另一列与float
OP中一样,则转换为object
dtype并调用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
这是我的解决方案;一个基本循环。