pandas DataFrame对象

import numpy as np

import pandas as pd
from pandas import Series, DataFrame

DataFrame结构:
列索引 列索引 列索引 列索引
行索引 value value value value
行索引 value value value value
行索引 value value value value
行索引 value value value value
行索引 value value value value

列和列的数据类型可以是不同的

# 一、构造DataFrame(两种方式)

# 方式一:使用DataFrame构造函数构造
DataFrame(np.random.randint(0,100,size=(3,5)))
DataFrame(np.random.randint(0,100,size=(3,5)), index=list("abc"), columns=list("ABCDE"))
# 方式二:使用字典构造
dict1 = {
    "A": np.random.randint(0,100,size=3),
    "B": np.random.randint(0,100,size=3),
    "C": np.random.randint(0,100,size=3),
    "D": np.random.randint(0,100,size=3),
    "E": np.random.randint(0,100,size=3),
}
DataFrame(dict1, index=list("abc"))
# 从文件中读取DataFrame对象
# pd.read_csv()
# pd.read_table()
# pd.read_excel()
# header=0  以第一行作为列标签
# index_col=0  以第零列作为行索引
# sheet_name=0  指定读取的是第一张表,也可以sheet_name="Sheet1",指定名称
df = pd.read_excel("D:\Desktop\计221员工表.xlsx", header=0, index_col=0, sheet_name="Sheet1")
# 保存
df.to_excel("计221.xlsx")
# 使用Series构造DataFrame
s1 = Series(np.random.randint(0,100,size=5),index=list("abcde"),name="python")
df2 = DataFrame(s1)
df2.shape
# 二、运算
df3 = DataFrame(np.random.randint(0, 100, size=(3,5)), index=["lucy", "mery", "tom"], columns=list("ABCDE"))
df3
# 求每列平均值
df3.mean()
# 求行平均值
df3.mean(axis=1)
# 求和 

# 默认求每列和
df3.sum()

# 求每行和
df3.sum(axis=1)
# 求中位数

# 默认求每列中位数
df3.median()
# DataFrame运算
# DataFrame和DataFrame(索引对齐相加)
df4 = DataFrame(np.random.randint(0,100,size=(3,4)), index=list("abc"), columns=list("ABCD"))
df5 = DataFrame(np.random.randint(0,100,size=(2,3)), index=list("ab"), columns=list("ABC"))
display(df4, df5, df4 + df5)
# DataFrame 和数组(numpy、Series)()

# DataFrame和numpy数组(广播)
np_array1 = np.ones(shape=(4)) 
np_array1 + df4

# DataFrame和Series(要注意索引)
s1 = Series(np_array1, index=list("ABCD"))
s1 + df4

# axis=0 行索引对齐
# axis=1 列索引对齐 
# df4.add(s1, axis=0)
# DataFrame 和一个数
df4 + 1  # 全员加1(广播)
# 练习

# 假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。
ddd = DataFrame(np.random.randint(0,150,size=(3,3)), index=["student_a","student_b","student_c"], columns=["语文","数学","英语"])
ddd2 = DataFrame(np.random.randint(0,150,size=(3,3)), index=["student_a","student_b","student_c"], columns=["语文","数学","英语"])
display(ddd, ddd2)
all = ddd + ddd2
all / 2
# 2.假设张三期中考试数学被发现作弊,要记为0分,如何实现?
ddd.iloc[2] = 0
ddd
# 3.李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?
ddd.iloc[0] += 100
ddd
# 4.后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?
ddd + 10
# 三、索引
# 访问DataFrame数据
df6 = DataFrame(np.random.randint(0,150,size=(3,5)), index=list("abc") , columns=list("ABCDE"))
df6
# 访问列
# 1.字典访问
df6["A"]  # 推荐
# 2.属性访问 
df6.A
# 3.列表访问
df6[["A", "B"]]

# 访问行
# 访问行必须用.loc
# .iloc是访问行的隐式索引
df6.loc["a"]
df6.loc[["a", "b"]]

df6.iloc[0]
df6.iloc[[0,1]]

# 访问元素
# numpy的访问逻辑一致(先行后列)
df6.loc["a","B"]
df6.iloc[0,1]

# 其他方式(间接访问,不推荐,可能会出问题)
# 间接访问适合读操作
# 直接访问适合读写操作
df6["B"]
df6["B"].iloc[0]
df6["B"]["a"]
df6["B"].values[0]
# 直接访问(推荐)
df6.loc["a","B"]
# 四、切片
# 标签处理的切片都是闭区间 
df7 = DataFrame(np.random.randint(0,150,(2,3)), list("ab"), list("ABC"))
df7
# .loc切
# 标签切片切的是行
df7["a": "b"]
df7.loc["a":"b"]  # 两者效果一样,都是切行

# 切列
df7.loc[:, "A": "B"]

# 隐式索引切
df7.iloc[0:1]
df7.iloc[0:1, 0:2]

# 用bool列表访问
bool_list1 = [True,False] 
bool_list2 = [True,False,True]
df7.loc[bool_list1,bool_list2]
df7.loc[:,bool_list2]

# Series的bool_list是索引对齐,与顺序无关
s1 = Series(bool_list1,list("ba"))
df7.loc[s1]

# 读取A\C
df7.loc[:, "A":"C":2]
df7[["A","C"]]

# 其他
df7[["A","C"]].loc[["a","b"]]

df7.loc[["a","b"], ["A","B"]]

作者:cloud-2-jane

出处:https://www.cnblogs.com/cloud-2-jane/articles/18609823

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   一只大学生  阅读(20)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示