本文目录:
前言:上期我们讲了Series和Dataframe的基本概念、常用属性和方法等,这次我们讲述Series和Dataframe的增删改查等操作。
一、Series的基础运算
Series可以与单数值进行基础运算:加减乘除,也可以和其它Series做加减乘除等运算,但需要满足如下条件:两个Series都必须是数值型。在两个Series做数值运算时,索引值一样的元素会相互运算,索引值不一样的会返回NaN。
DataFrame 的加减乘除运算规则和 Series 基本一致,都是基于 索引对齐(index alignment) 的原则进行运算,但 DataFrame 是 二维结构,因此会同时对齐 行索引(index)和列索引(columns)。【后面单以Series加减乘除运算为例,不再另行演示Dataframe的加减乘除】
代码如下:
# 加减乘除
s=pd.Series([1,2,3,4,5,6,7,8,9,10])
print(s*2)
print(s+2)
print(s-2)
print(s/2)
print(s*s)
print(s+s)
print(s-s)
print(s/s)
#除了乘法可以是字符串乘以数值,其它都必须是数值间运算
v=pd.Series(['A','B','C','D','E','F','G','H','I','J'])
print(v*2)
print(type(v))
索引不匹配情况:
#(1)s1和s2部分索引相同: 索引相同的会相互计算,索引不同的会返回为NaN
s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
s2 = pd.Series([10, 20, 30], index=['a', 'b', 'd'])
print(s1 + s2)
运行结果:
a 11.0
b 22.0
c NaN
d NaN
dtype: float64
#(2)s1和s2索引完全不同:运算结果的所有值都是 NaN
s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
s2 = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(s1 + s2)
运行结果:
a NaN
b NaN
c NaN
x NaN
y NaN
z NaN
dtype: float64
特别分享:Series与Dataframe的相互运算
运算规则: 按行对齐(默认)或按列对齐
1.默认按列对齐:Dataframe的列索引与Series的行对齐
2.按行对齐:axis=0
代码如下:
例:
import pandas as pd
#默认按列对齐:Dataframe的列索引与Series的行对齐
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=["row1", "row2", "row3"])
print(df)
s = pd.Series([10, 20], index=["A", "B"])
print(s)
print(df + s)
#按行对齐:axis=0
s = pd.Series([10, 20, 30], index=["row1", "row2", "row3"])
print(df.add(s, axis=0)) # 按行对齐(axis=0 表示匹配行索引)
二、Dataframe的相关操作
Dataframe的基础运算(加减乘除)和Series差不多,就不特别演示了;
分享Dataframe的其它常用操作。
(一)加载数据
**格式:**
pd对象.read_数据格式(路径)
# 例如:
pd.read_csv('data/movie.csv')
例:
# pd.read_pickle('output/scientists.pickle') # 读取Pickle文件中的内容pd对象.read_数据格式(路径)
# pd.read_excel('output/scientists.xlsx') # 多1个索引列
# pd.read_csv('output/scientists.csv') # 多1个索引列
pd.read_csv('output/scientists_noindex.csv') # 正常数据
**注意:** pandas读写excel需要额外安装如下三个包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlwt
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd
(二)通过 set_index()函数 设置行索引名字
例:
# 读取文件, 不指定索引, Pandas会自动加上从0开始的索引
movie = pd.read_csv('data/movie.csv')
print(movie.head())
# 设置 电影名 为索引列.
movie1 = movie.set_index('movie_title') #返回新的(inplace默认false),不修改原始数据
print(movie1.head())
# 如果加上 inplace=True, 则会修改原始的df对象
movie.set_index('movie_title', inplace=True)
print(movie.head()) # 原始的数据发生改变
#通过reset_index()函数, 可以将索引复原
movie.reset_index(inplace=True) # 加上inplace=True, 就是直接修改源数据
print(movie.head())
(三)DataFrame-修改行列索引
方式1: rename()函数, 可以对原有的行索引名 和 列名进行修改
rename()函数:可传入字典、函数、直接映射
rename()参数说明:
例:
movie = pd.read_csv('data/movie.csv', index_col='movie_title')
print(movie.index[:5]) # 前5个行索引名
print(movie.columns[:5]) # 前5个列名
# 手动修改下 行索引名 和 列名
idx_rename = {'Avatar': '阿凡达', "Pirates of the Caribbean: At World's End": '加勒比海盗'}
col_rename = {'color': '颜色', 'director_name': '导演名'}
# 通过rename()函数, 对原有的行索引名 和 列名进行修改
movie.rename(index=idx_rename, columns=col_rename).head()
方式2:把 index 和 columns属性提取出来, 修改之后, 再赋值回去
代码如下:
例:
因index类型不能直接修改:先转换为列表,再修改替换
movie = pd.read_csv('data/movie.csv', index_col='movie_title')
# 提取出 行索引名 和 列名, 并转成列表.
index_list = movie.index.tolist()
columns_list = movie.columns.tolist()
# 修改列表元素值
index_list[0] = '阿凡达'
index_list[1] = '加勒比海盗'
columns_list[0] = '颜色'
columns_list[1] = '导演名'
# 重新把修改后的值, 设置成 行索引 和 列名
movie.index = index_list
movie.columns = columns_list
# 查看数据
movie.head(5)
(四)添加-插入-删除数据
1.添加&插入列数据
(1)添加列(Dataframe以列为主):类似字典
代码如下:
例:
movie = pd.read_csv('data/movie.csv') #加载数据
# 通过 df[列名] = 值 的方式, 可以给df对象新增一列, 默认: 在df对象的最后添加一列.
movie['has_seen'] = 0 # 新增一列, 表示: 是否看过(该电影)
# 新增一列, 表示: 导演和演员 脸书总点赞数
movie['actor_director_facebook_likes'] = (
movie['actor_1_facebook_likes'] +
movie['actor_2_facebook_likes'] +
movie['actor_3_facebook_likes'] +
movie['director_facebook_likes']
)
movie.head() # 查看内容
(2)插入列数据:insert(只可指定位置插入单列数据)
代码如下:
例:
movie = pd.read_csv('data/movie.csv') #加载数据
# insert() 表示插入列. 参数解释: loc:插入位置(从索引0开始计数), column=列名, value=值
# 总利润 = 总收入 - 总预算,"loc=1"里的1表示第二列,也可简写为1
movie.insert(loc=1, column='profit', value=movie['gross'] - movie['budget'])
movie.head()
2.添加行数据
添加(修改)行:运用索引或者concat函数**
运用索引:loc[ ],[ ]里可传入行索引和列索引,行索引在前,列索引在后,当[ ]里只传入一个参数时,指的是行索引;注意:如果索引已存在数据,运用loc[ ]则是修改数据。
concat函数:传入字典,可以批量(传入多个字典)拼接行(类似添加);concat函数默认拼接行,如果传入axis=1,也可拼接列;还可设置 ignore_index=True 生成新索引,避免拼接后索引重复。
本还有append函数,但发展趋势是“弃用”,不再分享。
代码如下:
例:
#创建Dataframe对象
df = pd.DataFrame({"Name": ["Alice", "Bob"], "Age": [25, 30]})
# 添加行
# 1.按索引添加
df.loc[2] = ["Charlie", "Finance", 35, 7000]
#concat添加,默认添加到末尾,可添加多行
df = pd.concat([df, pd.DataFrame({"Name": ["Dave"], "Age": [40], "Department": ["Marketing"], "Salary": [8000]})])
运行结果:
Name Department Age Salary
0 Alice HR 25 5000
1 Bob Tech 30 6000
2 Charlie Finance 35 7000
3 Dave Marketing 40 8000
3.删除数据
代码如下:
例:
movie.drop('has_seen') # 报错, 需要指定方式, 按行删, 还是按列删.
# movie.drop('has_seen', axis='columns') # 按列删,columns代表列
# movie.drop('has_seen', axis=1) #将columns换成1, 同上效果
movie.head().drop([0, 1]) # 按行索引删, 即: 删除索引为0和1的行
(五)保存/导出数据到文件
格式
df对象.to_数据格式(路径)
# 例如:
df.to_csv('data/abc.csv')
# output文件夹必须存在
df.to_pickle('output/scientists.pickle') # 保存为 pickle文件
df.to_csv('output/scientists.csv') # 保存为 csv文件
df.to_excel('output/scientists.xlsx') # 保存为 Excel文件
df.to_excel('output/scientists_noindex.xlsx', index=False) # 保存为 Excel文件
df.to_csv('output/scientists_noindex.csv', index=False) # 保存为 Excel文件
df.to_csv('output/scientists_noindex.tsv', index=False, sep='\t')
print('保存成功')
**注意:**1.如要保存的对象是计算的中间结果,或者以后会在Python中复用,推荐保存成pickle文件;
2.如果保存成pickle文件,只能在python中使用,;pickle文件的扩展名可以是`.p,.pkl,.pickl`。
【特别注意】
Pandas中99%关于DF和Series调整的API(方法), 都会默认在副本上进行修改, 调用修改的方法后, 会把这个副本返回;
这类API都有一个共同的参数: inplace, 默认值是False;
如果把inplace的值改为True, 就会直接修改原来的数据, 此时这个方法就没有返回值了!!!
今天的分享到此结束。