栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pandas 数据类型之 DataFrame

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pandas 数据类型之 DataFrame


Python 官网:https://www.python.org/
  这里,才 python 前沿。可惜是英文原版。所以,我要练习英文阅读。類類

  • 我的CSDN主页
  • My Python 学习个人备忘录
  • 我的HOT
  • 老齐教室

  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。

            —— 华罗庚


笔记:pandas 数据类型之 DataFrame


此笔记,正在 编辑中……


        目录


一、DataFrame 实例创建
  1. 默认创建(数据直接生成 DatsFrame )
  2. 用姓名字符重置索引
  3. 用 date 重置 columns
  4. index、columns 都可以在创建 DataFrame 时设置
二、用 dict、Series 创建 DataFrame 实例
  1. Dict 创建
  2. Series 创建
  3. 索引 index
    a. 创建同时设置 index
    b. 重置 index
  4. 列序 columns
三、赋值
  1. 整列赋值
    a. 等长依次赋值
    b. 整列赋同一值
  2. 单个精准赋值
    a. 字典列表式赋值
    b. loc 方法选择赋值
四、df.loc 方法条件筛选 五、本笔记完整代码
回首页

  例子原始数据:六名学生每天跳绳练习个数记录(4月9日至4月13,5天)。

Tom = 453, 307, 618, 742, 267
Rose = 303, 421, 512, 289, 306
John = 367, 431, 519, 279, 336
Anna = 273, 391, 512, 289, 306
Duo = 283, 371, 507, 243, 323
Liuyi = 347, 291, 472, 329, 345

数据初处理:

  • 数据整合成一个列表,姓名字符列表准备好用来重置索引。
  • globals() 从全局变量名字典中列表解析 names 中的变量名字符串 ( locals() 当前变量函数和 dir() 也可以从当前作用域中获取变量名字符串,前者是跟 globals() 一样是字典,后者是列表)。
  • 直接对字典用一个变量遍历,就是对 key 操作(同时两个变量遍历字典,变量接收的依次是 key、value,类 doct.iters() 字典视图。),key 即是 globles() 获取的变量名字符串。
names = [Tom, Rose, John, Anna, Duo, Liuyi]
gb = globals() # 全局变量字典获取函数取别名,简化后续语句,方便读写。
names_str = [i for i in gb if gb[i] in names] # if 语句意即全局变量字典中 i 字符名称对应的变量在 names 中就解析出该字符串。

一、DataFrame 实例创建

  1. 默认创建
df = pd.DataFrame(names) # 1、数据直接生成 DatsFrame 。
print(f"nn{' 1、数据直接生成 DatsFrame ':-^34}nn{df}") 

运行效果

  默认定义没有设置特定索引,按照惯例( Series 中已经形成的惯例)索引就是从 0 开始的整数。从上面的结果中很明显表示出来,这就是一个二维的数据结构(类似 excel 或者 mysql 中的查看效果)。


回首页

  1. 用姓名字符重置索引。

  注意:“用 df.index = ”重置索引,index 序列元素一定要与 DataFrame 的行数匹配,否则报错。但,创建时设置,可以“短长”少的行被舍去,多的无值为空(NaN)。

df.index = names_str # 2、用姓名字符重置索引。
print(f"nn{' 2、用姓名字符设置索引 ':-^31}
n{cut_line()}{names_str}{cut_line()}{df}")

运行效果


回首页

用 date 设置 columns

代码

date = [f'{i}日' for i in range(9, 14)] # 准备日期列表。
df.columns = date # 三、用 date 设置 columns
print(f"nn{' 3、用 date 设置 columns ':-^37}
n{cut_line()}{date}{cut_line()}{df}")

运行效果


  至此,终于有了数据的样子。
每一行为一个学生的跳绳练习数据,每一列为每日跳绳练习各个学生跳绳练习数据,这才是一个有实际意义的二维数据表格的样子。


回首页

  1. 在创建 DataFrme 时,是可以直接设置 index 和 columns 的咯。

代码

df01 = pd.DataFrame(names, index=names_str)
df02 = pd.DataFrame(names, columns=date)
df03 = pd.DataFrame(names, columns=date, index=names_str)
print(f"nn{cut_line()}{'':>4}在创建 DataFrme 时,是可以直接设置 index 和 columns的。
{cut_line()}只设置 index:nn{df01}{cut_line()}
{cut_line()}只设置 columns:nn{df02}{cut_line()}
同时设置 index、columns:nn{df03}{cut_line()}")

运行效果


回首页

代码

 

运行效果


回首页

代码

 

运行效果


回首页

代码

 

运行效果


回首页

完整 Python 代码
  我的解题思路,已融入代码注释,博文中就不再赘述。

(如果从语句注释不能清楚作用,请评论区留言指教和探讨。欄)

#!/sur/bin/env python
# coding: utf-8

'''
filename: /sdcard/qpython/tem.py
梦幻精灵_cq的炼码场
'''

from mypythontools import color, wait, cut_line # 从自码工具模块加载需用代码模块中要使用的函数。
print(f"nn{'正在加载 Pandad ...':^38}")
import pandas as pd # 加载 pandas 并取别名 pd 。


# 例子原始数据:六名学生每天跳绳练习个数记录(4月9日至4月13,6天)。
Tom = 453, 307, 618, 742, 267
Rose = 303, 421, 512, 289, 306
John = 367, 431, 519, 279, 336
Anna = 273, 391, 512, 289, 306
Duo = 283, 371, 507, 243, 323
Liuyi = 347, 291, 472, 329, 345

# 数据初处理:数据整合成一个列表,姓名字符列表准备好用来重置索引。
names = [Tom, Rose, John, Anna, Duo, Liuyi]
gb = globals() # 全局变量字典获取函数取别名,简化后续语句,方便读写。
# 从全局变量名字典中列表解析 names 中的变量名字符串。
# 直接对字典用一个变量遍历,就是对 key 操作(同时两个变量遍历字典,变量接收的依次是 key、value,类 doct.iters() 字典视图。),key 即是 globles() 获取的变量名字符串。
names_str = [i for i in gb if gb[i] in names] # if 语句意即全局变量字典中 i 字符名称对应的变量在 names 中就解析出该字符串。

# 创建 DataFrame 
df = pd.DataFrame(names) # 1、数据直接生成 DatsFrame 。
print(f"nn{' 1、数据直接生成 DatsFrame ':-^34}nn{df}") # 上面的定义中没有设置特定索引,所以,按照惯例( Series 中已经形成的惯例)就是从 0 开始的整数。从上面的结果中很明显表示出来,这就是一个二维的数据结构(类似 excel 或者 mysql 中的查看效果)。

df.index = names_str # 2、用姓名字符重置索引。
print(f"nn{' 2、用姓名字符设置索引 ':-^31}
n{cut_line()}{names_str}{cut_line()}{df}") # 注意:“用 df.index = ”重置索引,index 序列元素一定要与 DataFrame 的行数匹配,否则报错。但,创建时设置,可以“短长”少的行被舍去,多的无值为空(NaN)。

date = [f'{i}日' for i in range(9, 14)] # 准备日期列表。
df.columns = date # 三、用 date 设置 columns
print(f"nn{' 3、用 date 设置 columns ':-^37}
n{cut_line()}{date}{cut_line()}{df}")

# 在创建 DataFrme 时,是可以直接设置 index 和 columns 的咯。
df01 = pd.DataFrame(names, index=names_str)
df02 = pd.DataFrame(names, columns=date)
df03 = pd.DataFrame(names, columns=date, index=names_str)
print(f"nn{cut_line()}{'':>4}在创建 DataFrme 时,是可以直接设置 index 和 columns的。
{cut_line()}只设置 index:nn{df01}{cut_line()}
{cut_line()}只设置 columns:nn{df02}{cut_line()}
同时设置 index、columns:nn{df03}{cut_line()}")

data_date = [] # 从每个学生数据中提取每日学生数据。
for k in range(5): # 循环提取每天数据。
    tem = [] # 每人每天数据列表。
    for i in names:
        tem.append(i[k]) # 追加当天每人数据。
    data_date.append(tem) # 追加当天每人数据。

# 二、用 dict、Series 创建 DataFrame 实例。

# Dict:
data_dict_d = {x: y for x, y in zip(date, data_date)} # 解析每日学生数据字典。
df_dict_d = pd.DataFrame(data_dict_d, index=names_str)

data_dict_n = {x: y for x, y in zip(names_str, names)} # 解析每日学生数据字典。
df_dict_n = pd.DataFrame(data_dict_n, index=date) # 使用 dict 定义。这是定义一个 DataFrame 对象的常用方法。字典的“键”( names、date )就是 DataFrame 的 index、columns 的值(名称),字典中每个“键”的“值”是一个列表,它们就是那一竖列中的具体填充数据。

# Series:
data_S_date = [pd.Series(i, index=names_str) for i in data_date] # 解析 Series 数据列表。
df_S_d = pd.DataFrame(data_S_date, index=date)

data_S_name = [pd.Series(i, index=date) for i in names] # 解析 Series 数据列表。
df_S_n = pd.DataFrame(data_S_name, index=names_str)

print(f"nn{' 二、用 dict、Series 创建 DataFrame 实例。':-^33}
nn{cut_line()}用 Dict 创建 DataFrame 实例:
nncolumns = date:n{df_dict_d}
nncolumns = name:n{df_dict_n}

{cut_line()}用 Series 创建 DataFrame 实例:
nncolumns = datenn{df_S_n}
nncolumns = Namenn{df_S_d}") # 从上面的例子可以看出,不管是用 dict 还是 Series ,都可以定义出自己喜好的二维数组数据列表,真可谓是“随心所欲”。珞珞 columns 的顺序没有规定,就如同字典中键的顺序一样。但是在 DataFrame 中,columns 跟字典键相比,有一个明显不同,就是其顺序可以被规定。

d = data_dict_d # 每日数据字典变量起别名,简短代码语句。
dd = {} # 嵌套字典:{date: {name: 数据}}。
for x, y in zip(date, d): # 生成外层字典键。
    tem = {} # 外层字典值,内层字典。
    for m,n in zip(names_str, d.get(y)):
        	tem[m] = n # 内层字典赋值。
    dd[x] = tem # 外层字典赋值。

# 定义 DataFrame 的方法,除了上面的之外,还可以使用“字典套字典”的方式。
df = pd.DataFrame(dd) # dict 套 dict 创建 Dataframe 。
print(f"nn{' 三、dict 套 dict 创建 Dataframe ':-^37}
{cut_line()}嵌套字典:nn{dd}
{cut_line()}创建的 Dataframe:nn{df}{cut_line()}") # 在字典中就规定好数列名称(第一层键)和每横行索引(第二层字典键)以及对应的数据(第二层字典值),也就是在字典中规定好了每个数据格子中的数据。

new_data = {'Anna': 337, 'Tom': 403, 'Rose': 567, 'Liuquan': 453} # 4月17日数据。
dd['14日'] = new_data # 追加新数据到嵌套字典。
df_new_dict = pd.DataFrame(dd, index=names_str.append('Liuquan')) # 用嵌套字典重建 DataFrame 。
print(f"{cut_line()}原姓名列表:nn{names_str}
nn在 DataFrame 中 执行 index=names_str.append('Liuquan') 后的 names_str :n{names_str}{cut_line()}")

new_Series = pd.Series(new_data) # 4月17日数据打包成 Series 。注意:参数只能是列表或一层字典,因为 Series 是一维数组。
df_new_S = df.copy() # DataFrame 对象复制。
df_new_S['14日'] = new_Series # 追加 Series 到 DataFrame 。
print(f"{cut_line()}4月14日数据:n{new_data}
nn追加后姓名列表:nn{names_str}
nn{' 数据追加嵌套字典,新建 DataFrame ':-^30}nn{df_new_dict}
nn{' 数据创建 Seroies,追加 DataFrame ':-^34}nn{df_new_S}
nn{' 没有数据填充的单元都是空(NaN)':-^29}{cut_line()}") # 如您所见,Series 追加数据虽然方便快捷,但不可以新增行索引。DataFrame 新建实例确是可以定义多于数据的索引的。这,就需要根据追加的数据选择了。当然,我更喜欢 Series 。

# 追加列
df = df_new_dict.copy() # DataFrame 对象复制。
print(f"{cut_line()}当前 DataFrame:nn{df}")
df['15日'] = pd.Series() # 添加空列。
print(f"nn{'添加空列':-^38}nn{df}")
data_new1 = (389, 452, 422, 309, 433, 398, 409) # 用数组添加列,元素一定匹配列数,不然报错。
df['15日'] = data_new1 # 整列依次赋值(元素须与行数匹配,类型可以是 tuple、list等有序数组)。
print(f"nn{'对空列依次赋值':-^35}nn数据 = {data_new1}nn{df}")
data_new2 = {'Anna': 347, 'Any': 564, 'Liuyi': 389, 'Tom': 422, 'Duo': 402, 'John': 338, 'Rose': 409, 'Liuquan': 309}
df['16日'] = pd.Series(data_new2) # 添加不等行数元素,可以用 dict、Series ,不多于 DataFrame 行数的数据,二者皆可;多于行数就只可以 Series 数据类型添加。DataFrame 会自动对齐索引,不在意数据字典顺序。索引中没有的数据,将被“丢弃”。
print(f"nn{'用 Series 添加元素多于行数的数据':-^30}
nn数据 = {data_new2}nn{df}")

df.insert(0, '班级', [f'4.{i}班' for i in range(1, 8)])
index_num = list(df.columns).index('16日') + 1
df.insert(index_num, '职务', '学生') # 插入列,赋同一值也可赋不同值(不同值数量一定得与行数匹配)。DataFrame ,添加本来没有的列(字典可以添加本来没有的键)。
print(f"nn{' 插入列(colmuns) ':-^34}nn{df}")

columns_lis = ['班级'] + [f'{i}日' for i in range(16, 8, -1)]+['职务']
print(f"nn{'重置列序':-^38}nn列序:n{columns_lis}
nn{df.loc[:, columns_lis]}{cut_line()}")

# 点对点准赋值
print(f"{cut_line()} Liuquan 4月9日、16日数据:n{df['9日']['Liuquan']},{df['16日']['Liuquan']}")
df['9日']['Liuquan'] = 453 # 虽然跟loc方法同效,但我的两个 pandas (python3.10.2+pandas1.4.1、python3.6.6+pandas0.23.4)环境都有“警告”。
df['16日']['Liuquan'] = 386
print(f"nn补录(修改)后 Liuquan 4月9日、16日数据:n{df['11日']['Liuquan']},{df['13日']['Liuquan']}{cut_line()}")

df.loc['Liuquan', ['9日']] = 453 # 用loc 方法修改更明了,且静默。
df.loc['Liuquan', ['11日']] = 386
print(f"{cut_line()}Liuquan 4月9日、11日(453, 386)数据补录:nn{df}
nn{df[df.index == 'Liuquan']}{cut_line()}")

回首页

上一篇: 练习:身高出现的频次

下一篇: 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )


我的HOT博:
  • New:Python字符串居中显示(1050阅读)
  • New:练习:求偶数和、阈值分割和求差( list 对象的两个基础小题)(1314阅读)
  • 用 pandas 解一道小题(1916阅读)
  • 可迭代对象和四个函数(1042阅读)
  • “快乐数”判断(1206阅读)
  • 罗马数字转换器(构造元素取模)(1894阅读)
  • 罗马数字(转换器|罗生成器)(2565阅读)
  • Hot:让QQ群昵称色变的代码(17712阅读)
  • Hot:斐波那契数列(递归| for )(3368阅读)
  • 柱状图中最大矩形(1625阅读)
  • 排序数组元素的重复起止(1215阅读)
  • 电话拨号键盘字母组合(1284阅读)
  • 密码强度检测器(1746阅读)
  • 求列表平衡点(1787阅读)
  • Hot: 字符串统计(3611阅读)
  • Hot:尼姆游戏(聪明版首发)(3348阅读)尼姆游戏(优化版)(903阅读)
推荐条件 点阅破千

回首页


精品文章:
  • 好文力荐:《python 完全自学教程》齐伟书稿免费连载
  • OPP三大特性:封装中的property
  • 通过内置对象理解python'
  • 正则表达式
  • python中“*”的作用
  • Python 完全自学手册
  • 海象运算符
  • Python中的 `!=`与`is not`不同
  • 学习编程的正确方法

来源:老齐教室


回首页

Python 入门指南【Python 3.6.3】
好文力荐:
  • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
  • 靠谱程序员的好习惯

CSDN实用技巧博文:
  • 8个好用到爆的Python实用技巧
  • python忽略警告

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/849111.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号