设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 135|回复: 16

pandas中DataFrame字典互转的实现

[复制链接]

3

主题

44

回帖

154

积分

注册会员

积分
154
发表于 2024-4-19 20:17:29 | 显示全部楼层 |阅读模式
目录


1. dict转化为DataFrame

根据dict形式的不同,选择不同的转化方式,主要用的方法是 DataFrame.from_dict,其官方文档如下:

  • pandas.DataFrame.from_dict

    • classmethod DataFrame.from_dict(data, orient=‘columns’, dtype=None, columns=None)
    • Construct DataFrame from dict of array-like or dicts.
    • Creates DataFrame object from dictionary by columns or by index allowing dtype specification.
    • Parameters

      • data [dict] Of the form {field : array-like} or {field : dict}.
      • orient [{‘columns’, ‘index’}, default ‘columns’] The “orientation” of the data. If the
        keys of the passed dict should be the columns of the resulting DataFrame, pass ‘columns’ (default). Otherwise if the keys should be rows, pass ‘index’.
      • dtype [dtype, default None] Data type to force, otherwise infer.
      • columns [list, default None] Column labels to use when orient=‘index’. Raises
        a ValueError if used with orient=‘columns’.

    • Returns

      • DataFrame



1.1 dict的value是不可迭代的对象

1. from_dict
如果用from_dict,必须设置orient=‘index’,要不然会报错,也就是dict的key不能用于columns。
  1. dic = {'name': 'abc', 'age': 18, 'job': 'teacher'}
  2. df = pd.DataFrame.from_dict(dic, orient='index')
  3. print(df)
复制代码
Out:
  1.             0name      abcage        18job   teacher
复制代码
2. 土法转换
dict先转换成Series,再将Series转换成Dataframe,再重设索引,重命名列名。
  1. dic = {'name': 'abc', 'age': 18, 'job': 'teacher'}
  2. df = pd.DataFrame(pd.Series(dic), columns=['value'])
  3. df = df.reset_index().rename(columns={'index': 'key'})
  4. print(df)
复制代码
Out:
  1.     key    value0  name      abc1   age       182   job  teacher
复制代码
1.2 dict的value为list

1.2.1 当没有指定orient时,默认将key值作为列名。(列排列)
  1. dic = {'color': ['blue', 'green', 'orange', 'yellow'], 'size': [15, 20, 20, 25]}
  2. df = pd.DataFrame.from_dict(dic)
  3. print(df)
复制代码
Out:
  1.     color  size0    blue    151   green    202  orange    203  yellow    25
复制代码
1.2.2 当指定orient=‘index’时,将key值作为行名。(行排列)
  1. dic = {'color': ['blue', 'green', 'orange', 'yellow'], 'size': [15, 20, 20, 25]}
  2. df = pd.DataFrame.from_dict(dic, orient='index', columns=list('ABCD'))
  3. print(df)
复制代码
Out:
  1.           A      B       C       Dcolor  blue  green  orange  yellowsize     15     20      20      25
复制代码
总结
orient指定为什么, dict的key就作为什么
如orient=‘index’,那么dict的key就作为行索引。

1.3 dict的value是dict

1.3.1 使用默认的orient属性,key将当做columns使用
  1. dic = {'Jack': {'hobby': 'football', 'age': 19},
  2.        'Tom': {'hobby': 'basketball', 'age': 24},
  3.        'Lucy': {'hobby': 'swimming', 'age': 20},
  4.        'Lily': {'age': 21}}
  5. df = pd.DataFrame.from_dict(dic)
  6. print(df)
复制代码
Out:
  1.            Jack         Tom      Lucy  Lilyage          19          24        20  21.0hobby  football  basketball  swimming   NaN
复制代码
这是使用了dict嵌套dict的写法,外层dict的key为columns,values内的dict的keys为rows的名称,缺省的值为NAN
1.3.2 当指定orient=‘index’时,内部的key为columns,外部的key为index
当修改orient的默认值’columns’为’index’,内部的key为DataFrame的columns,外部的key为DataFrame的index
  1. dic = {'Jack': {'hobby': 'football', 'age': 19},
  2.        'Tom': {'hobby': 'basketball', 'age': 24},
  3.        'Lucy': {'hobby': 'swimming', 'age': 20},
  4.        'Lily': {'age': 21}}
  5. df = pd.DataFrame.from_dict(dic, orient='index')
  6. print(df)
复制代码
Out:
  1.            hobby  ageJack    football   19Lily         NaN   21Lucy    swimming   20Tom   basketball   24
复制代码
注意
当时使用dict嵌套dict的时候,设置了orient='index’后,不能再为columns命名了,此时,如果设定columns,只会筛选出在原DataFrame中已经存在的columns。
  1. dic = {'Jack': {'hobby': 'football', 'age': 19},
  2.        'Tom': {'hobby': 'basketball', 'age': 24},
  3.        'Lucy': {'hobby': 'swimming', 'age': 20},
  4.        'Lily': {'age': 21}}
  5. df = pd.DataFrame.from_dict(dic, orient='index', columns=['age', 'A'])
  6. print(df)
复制代码
Out:
  1.       age    AJack   19  NaNLily   21  NaNLucy   20  NaNTom    24  NaN
复制代码
2.DataFrame转换成 dict

DataFrame.to_dict官方文档:

  • pandas.DataFrame.to_dict

    • DataFrame.to_dict(orient=‘dict’, into=<class ‘dict’>)
    • Convert the DataFrame to a dictionary.
    • The type of the key-value pairs can be customized with the parameters (see below).
    • Parameters

      • orient [str {‘dict’, ‘list’, ‘series’, ‘split’, ‘records’, ‘index’}] Determines the type of the
        values of the dictionary.
        • ‘dict’ (default) : dict like {column -> {index -> value}}
        • ‘list’ : dict like {column -> [values]}
        • ‘series’ : dict like {column -> Series(values)}
        • ‘split’ : dict like {‘index’ -> [index], ‘columns’ -> [columns], ‘data’ -> [values]}
        • ‘records’ : list like [{column -> value}, . . . , {column -> value}]
        • ‘index’ : dict like {index -> {column -> value}}
        Abbreviations are allowed. s indicates series and sp indicates split.
      • into [class, default dict] The collections.abc.Mapping subclass used for all Mappings
        in the return value. Can be the actual class or an empty instance of the mapping
        type you want. If you want a collections.defaultdict, you must pass it initialized.

    • Returnsdict, list or collections.abc.Mapping Return a collections.abc.Mapping object representing the DataFrame. The resulting transformation depends on the orient parameter.

  • 函数种只需要填写一个参数:orient 即可,但对于写入orient的不同,字典的构造方式也不同,官网一共给出了6种,并且其中一种是列表类型:

    • orient =‘dict’,是函数默认的,转化后的字典形式:{column(列名) : {index(行名) : value(值) )}};
    • orient =‘list’ ,转化后的字典形式:{column(列名) :{ values }};
    • orient=‘series’ ,转化后的字典形式:{column(列名) : Series (values) (值)};
    • orient =‘split’ ,转化后的字典形式:{‘index’ : [index],‘columns’ :[columns],’data‘ : [values]};
    • orient =‘records’ ,转化后是 list形式:[{column(列名) : value(值)}…{column:value}];
    • orient =‘index’ ,转化后的字典形式:{index(值) : {column(列名) : value(值)}};

  • 说明:上面中 value 代表数据表中的值,column表示列名,index 表示行名
  1. df = pd.DataFrame({'col_1': [5, 6, 7], 'col_2': [0.35, 0.96, 0.55]}, index=['row1', 'row2', 'row3'])
  2. print(df)
复制代码
Out:
  1.       col_1  col_2row1      5   0.35row2      6   0.96row3      7   0.55
复制代码
2.1 orient =‘list’

{column(列名) : { values }};
生成dict中 key为各列名,value为各列对应值的list
  1. df = df.to_dict(orient='list')
  2. print(df)
复制代码
Out:
  1. {'col_1': [5, 6, 7], 'col_2': [0.35, 0.96, 0.55]}
复制代码
2.2 orient =‘dict’

{column(列名) : {index(行名) : value(值) )}}
  1. df = df.to_dict(orient='dict')
  2. print(df)
复制代码
Out:
  1. {'col_1': {'row1': 5, 'row2': 6, 'row3': 7}, 'col_2': {'row1': 0.35, 'row2': 0.96, 'row3': 0.55}}
复制代码
2.3 orient =‘series’

{column(列名) : Series (values) (值)};
orient =‘series’ 与 orient = ‘list’ 唯一区别就是,这里的 value 是 Series数据类型,而前者为列表类型.
  1. df = df.to_dict(orient='series')
  2. print(df)
复制代码
Out:
  1. {'col_1': row1    5row2    6row3    7Name: col_1, dtype: int64, 'col_2': row1    0.35row2    0.96row3    0.55Name: col_2, dtype: float64}
复制代码
2.4 orient =‘split’

{‘index’ : [index],‘columns’ :[columns],’data‘ : [values]};orient =‘split’ 得到三个键值对,列名、行名、值各一个,value统一都是列表形式;
  1. df = df.to_dict(orient='split')
  2. print(df)
复制代码
Out:
  1. {'index': ['row1', 'row2', 'row3'], 'columns': ['col_1', 'col_2'], 'data': [[5, 0.35], [6, 0.96], [7, 0.55]]}
复制代码
2.5 orient =‘records’

[{column:value(值)},{column:value}…{column:value}];注意的是,orient =‘records’ 返回的数据类型不是 dict ; 而是list 列表形式,由全部列名与每一行的值形成一一对应的映射关系:
  1. df = df.to_dict(orient='records')
  2. print(df)
复制代码
Out:
  1. [{'col_1': 5, 'col_2': 0.35}, {'col_1': 6, 'col_2': 0.96}, {'col_1': 7, 'col_2': 0.55}]
复制代码
这个构造方式的好处就是,很容易得到 列名与某一行值形成得字典数据;例如我想要第1行{column:value}得数据:
  1. print(df.to_dict('records')[1])
复制代码
Out:
  1. {'col_1': 6, 'col_2': 0.96}
复制代码
2.6 orient =‘index’

{index:{culumn:value}};
orient ='index’与orient =‘dict’ 用法刚好相反,求某一行中列名与值之间一一对应关系(查询效果与orient =‘records’ 相似):
  1. print(df.to_dict('index'))
复制代码
Out:
  1. {'row1': {'col_1': 5, 'col_2': 0.35}, 'row2': {'col_1': 6, 'col_2': 0.96}, 'row3': {'col_1': 7, 'col_2': 0.55}}
复制代码
查询行名为 row1 列名与值一一对应字典数据类型
  1. print(df.to_dict('index')['row1'])
复制代码
Out:
  1. {'col_1': 5, 'col_2': 0.35}
复制代码
到此这篇关于pandas中DataFrame字典互转的实现的文章就介绍到这了,更多相关pandas DataFrame字典互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

0

主题

47

回帖

95

积分

注册会员

积分
95
发表于 2024-4-27 20:42:50 | 显示全部楼层
已测试,非常不错

3

主题

67

回帖

201

积分

中级会员

积分
201
发表于 2024-5-1 16:14:21 | 显示全部楼层
牛逼

0

主题

62

回帖

121

积分

注册会员

积分
121
发表于 2024-5-5 18:39:35 | 显示全部楼层
太棒了!感谢分享这个信息!

1

主题

57

回帖

137

积分

注册会员

积分
137
发表于 2024-5-7 06:39:25 | 显示全部楼层
我不太确定,可能需要再确认一下。
发表于 2024-7-12 00:52:40 | 显示全部楼层
666666666666

1

主题

76

回帖

172

积分

注册会员

积分
172
发表于 2024-7-30 14:32:12 | 显示全部楼层
好用好用

0

主题

54

回帖

107

积分

注册会员

积分
107
发表于 2024-8-6 17:21:01 | 显示全部楼层
同意你的观点,我们有共鸣。

0

主题

41

回帖

83

积分

等待验证会员

积分
83

热心会员付费会员

发表于 2024-8-25 17:41:06 | 显示全部楼层
谢谢你的提醒,我会注意的。

1

主题

38

回帖

111

积分

注册会员

积分
111

热心会员付费会员

发表于 2024-8-29 11:35:24 | 显示全部楼层
我不确定这个信息的准确性,请再确认一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-24 10:23 , Processed in 0.103602 second(s), 27 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表