社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

数据分析 | DataFrame与Python内置数据结构的相互转换

Crossin的编程教室 • 2 年前 • 758 次点击  

大家好,欢迎来到 Crossin的编程教室~

pandas 支持我们从 Excel、CSV、数据库等不同数据源当中读取数据,来构建 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 的文档。

作者:古明地觉

来源:古明地觉的编程教室

Crossin的新书《码上行动:用ChatGPT学会Python编程》已经上市了。本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。【点此查看详细介绍】

购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。

Crossin的其他书籍:



添加微信 crossin123 ,加入编程教室共同学习~

感谢转发和点赞的各位~

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/166899