我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文还是对以前文章的numpydataframe再次进行知识点的总结和对比,其最大变数就是tuple类型的加入。tuplelist是一对相近的数据类型。list=>[]是可变的,tuple=>()是不可变的。本文中的特殊组合就是:np.array([(),()]),它构成了一个和dataframe非常类似的数据结构。

苏南大叔:python结构化数据,numpy+tuple数据组合对比dataframe - numpy对比dataframe结构化数据
python结构化数据,numpy+tuple数据组合对比dataframe(图1-1)

苏南大叔的“平行空间笔记本”博客,记录苏南大叔的代码编程经验文章。测试环境:win10python@3.12.0numpy@1.26.1

numpy+list+tuple,np.array([(),()])

常见的numpy格式数据,理论上每个元素都是同一个格式的。比如:整数1类型,会因为另外一个字符串'1'的存在,而被强制转为字符串类型。但是,tuple的加入,改变了这种情况。

import numpy as np
_dtype = np.dtype([('姓名', np.unicode_, 16), ('成绩', np.float64, (2,))]) # 长度的位置居然可以定义tuple
_data = [('苏学霸', (92.0, 89.0)), ('南学渣', (60.0, 59))]
x = np.array(_data, dtype=_dtype)
print(x)                    # [('苏学霸', [92., 89.]) ('南学渣', [60., 59.])]
print(type(x))              # <class 'numpy.ndarray'>
print(x['姓名'])            # ['苏学霸' '南学渣']
print(x[1])                 # ('南学渣', [60., 59.])
print(x[1]['成绩'])         # [60. 59.]
print(x.dtype)              # [('姓名', '<U16'), ('成绩', '<f8', (2,))]
print(x.dtype.names)        # ('姓名', '成绩')
print(x.dtype[0])           # <U16
print(x.dtype[1])           # ('<f8', (2,))
print(x.dtype[1].name)      # void128
print(x.dtype[1].byteorder) # |
print(x.dtype[1].itemsize)  # 16

dataframe+list+tuple,pd.DataFrame([(),()])

import pandas as pd
x2 = pd.DataFrame([('苏学霸', (92.0, 89.0)), ('南学渣', (60.0, 59))],columns=['姓名', '成绩'])
x2 = pd.DataFrame(x.tolist(),columns=list(x.dtype.names))  # 和直接定义数据效果一致
print(x2)
'''
    姓名           成绩
0  苏学霸  (92.0, 89.0)
1  南学渣    (60.0, 59)
'''
print(type(x2))              # <class 'pandas.core.frame.DataFrame'>
print(x2['姓名'],list(x2['姓名'])) 
'''
0    苏学霸
1    南学渣
Name: 姓名, dtype: object
'''
print(list(x2['姓名']))      # ['苏学霸', '南学渣']
print(x2.loc[1,:])
'''
姓名    南学渣
成绩    (60.0, 59)
Name: 1, dtype: object
'''
print(x2.iloc[1,:])
'''
姓名    南学渣
成绩    (60.0, 59)
Name: 1, dtype: object
'''
print(x2.loc[1,:]["成绩"])   # (60.0, 59)
print(x2.iloc[1,:]["成绩"])  # (60.0, 59)
print(x2.dtypes)
'''
姓名    object
成绩    object
dtype: object
'''

另外一个简单例子

import numpy as np
_dtype = np.dtype([('姓名', np.str_,10), ('成绩', int)])
_data = [('苏学霸', 99), ('南学渣',59)]
x = np.array(_data, dtype=_dtype)
print(x)             # [('苏学霸', 99) ('南学渣', 59)]
print(type(x))       # <class 'numpy.ndarray'>
print(x["姓名"])     # ['苏学霸' '南学渣']

结语

万变不离其宗,其实还是那个数据,就是换成不同的格式,就有了不同的使用方法。更多苏南大叔的python经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python