本文作者:云初冀北

Python中DataFrame与内置数据结构相互转换的实现

Python中DataFrame与内置数据结构相互转换的实现摘要: 楔子pandas 支持我们从 Excel、CSV、数据库等不同数据源当中读取数据,来构建 DataFrame。但有时数据并不来自这些外部数据源,而是来自一个已经存在的 Python...

?=楔子

pandas 支持我们从 Excelcsv数据库等不同数据源当中读取数据,来构建 DataFrame。但有时数据并不来自这些外部数据源,而是来自一个已经存在的 Python 数据结构,比如列表字典等等。

同理当需要导出 dataframe 时,也不一定非要写到外部文件里,而是希望生成字典或者表,那么这个时候该怎么做呢?

所以这就涉及到了 DataFrame 和 python 内置数据结构之间的相互转换,下面来介绍一些最佳实践,你可以根据实际情况进选择

DataFrame 转成内置数据结构

假设有这样一个 DataFrame:

import Pandas as Pd  df = pd.DataFrame({"name": ["Satori", "Koishi", "Marisa"],                    "score": [99, 98, 100],                    "rank": [2, 3, 1]})  print(df) """      name  score  rank 0  Satori     99     2 1  Koishi     98     3 2  Marisa    100     1 """

那么看看 DataFrame 都提供了哪些方法,以及在转成内置数据结构之后是什么样子?

df.to_records()

将 DataFrame 转成 numpy数组,数组里面是一个个的元组

print(df.to_records()) """ [(0, 'Satori',  99, 2) (1, 'Koishi',  98, 3) (2, 'Marisa', 100, 1)] """ # 返回的时候将索引也带上了,我们可以去掉 print(df.to_records(index=False)) """ [('Satori',  99, 2) ('Koishi',  98, 3) ('Marisa', 100, 1)] """ # df.to_records 返回的是 Numpy 的数组,可以再转成列表 print(df.to_records(index=False).tolist()) """ [('Satori', 99, 2), ('Koishi', 98, 3), ('Marisa', 100, 1)] """

这种数据结构还是很常见的,在工作中经常会用到。但唯一不好的是,字段信息丢失了。

df.to_dict()

将 DataFrame 转成 Python 的字典。

# 返回 Python 的字典,key 是字段名,value 是对应的每一列 print(df.to_DIct()) """ {'name': {0: 'Satori', 1: 'Koishi', 2: 'Marisa'},  'rank': {0: 2, 1: 3, 2: 1},  'score': {0: 99, 1: 98, 2: 100}} """  # 但这里的 value 有一些问题,就是它把索引也含在里面了 # 我们可以去掉它 print(     {k: tuple(v.values()) for k, v in df.to_dict().items()} ) """ {'name': ('Satori', 'Koishi', 'Marisa'),  'rank': (2, 3, 1),  'score': (99, 98, 100)} """  # 当然啦,to_dict() 还可以手动实现 print(     {col: tuple(df[col]) for col in df.columns} ) """ {'name': ('Satori', 'Koishi', 'Marisa'),  'rank': (2, 3, 1),  'score': (99, 98, 100)} """

这种格式的数据用的就不多了,用得更多的是下一种。

df.to_dict(orient="records")

将 DataFrame 转成 Python 的列表,列表里面是一个个的字典,每个字典代表数据的每一行。

print(df.to_dict(orient="records")) """ [{'name': 'Satori', 'rank': 2, 'score': 99},  {'name': 'Koishi', 'rank': 3, 'score': 98},  {'name': 'Marisa', 'rank': 1, 'score': 100}] """

个人觉得这种数据结构应该用得最多。

DataFrame 生成的数据还有其它格式,这里就不赘述了,常用的就是上面几种。

内置数据结构转成 DataFrame

内置数据结构转成 DataFrame,我们也来介绍几个最常用的场景。

import Pandas as pd  data = [{'name': 'Satori', 'rank': 2, 'score': 99},         {'name': 'Koishi', 'rank': 3, 'score': 98},         {'name': 'Marisa', 'rank': 1, 'score': 100}]  # 对于这种数据,可以通过 DataFrame 的 from_records 方法 # 列表里的字典代表了 DataFrame 的每一行,每个字典都具有相同的 key # 而这些 key 则表示 DataFrame 的列 print(pd.DataFrame.from_records(data)) """      name  rank  score 0  Satori     2     99 1  Koishi     3     98 2  Marisa     1    100 """ # 或者更简单的,直接调用 pd.DataFrame 即可 print(pd.DataFrame(data)) """      name  rank  score 0  Satori     2     99 1  Koishi     3     98 2  Marisa     1    100 """ # 如果列表里面的字典,不具备相同的 key,会怎么样呢? data[2]["length"] = 155 print(pd.DataFrame(data)) """      name  rank  score  length 0  Satori     2     99     NaN 1  Koishi     3     98     NaN 2  Marisa     1    100   155.0 """ # 很简单,会将所有的 key 都考虑在内 # 如果某一行没有指定的 key,那么对应的值就是空

当然数据也可能是这种格式:

import pandas as pd  data = {'2020-01-01': {'name': 'Satori', 'rank': 2, 'score': 99},         '2020-01-02': {'name': 'Koishi', 'rank': 3, 'score': 98},         '2020-01-03': {'name': 'Marisa', 'rank': 1, 'score': 100}}  print(pd.DataFrame.from_dict(data, orient="index")) """               name  rank  score 2020-01-01  Satori     2     99 2020-01-02  Koishi     3     98 2020-01-03  Marisa     1    100 """

最后一种:

import pandas as pd  data = {'name': ['Satori', 'Koishi', 'Marisa'],         'rank': [2, 3, 1],         'score': [99, 98, 100]} # 直接调用 DataFrame 即可 print(pd.DataFrame(data)) """      name  rank  score 0  Satori     2     99 1  Koishi     3     98 2  Marisa     1    100 """

上面就是本文的内容,比较简单。并且相关函数的具体用法,也没有详细说明,只是从工作角度介绍了一些最佳实践。更多内容,可以查看 pandas 的注释

到此这篇关于Python中DataFrame与内置数据结构相互转换的实现的文章就介绍到这了,更多相关Python DataFrame内置数据结构内容请搜索云初冀北以前的文章或继续浏览下面的相关文章希望大家以后多多支持云初冀北!

免责声明
本站提供的资源,都来自网络,版权争议与本站无关,所有内容及软件的文章仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,我们不保证内容的长久可用性,通过使用本站内容随之而来的风险与本站无关,您必须在下载后的24个小时之内,从您的电脑/手机中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。侵删请致信E-mail:Goliszhou@gmail.com
$

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,131人围观)参与讨论

还没有评论,来说两句吧...