目录
前言
一、列操作
1.修改变量列
2.筛选变量列
3.删除变量列
4.添加变量列
二、数据类型的转换
1.查看数据类型
2.将 ok的int类型转换成float类型
3.将ar的float类型转换成int类型
三、建立索引
1.建立DataFrame时建立索引
2.在读入数据时建立索引
3.指定某列或者多列为索引列
4.将索引还原变量列
四、引用和修改索引
1.引用索引
2.修改索引名
3.修改索引名
4.更新索引
五、Series的索引和切片
1.索引
2.切片
3.loc 和 iloc
六、DataFrame的索引和切片
1.选择列
2.选择行
3.获取满足条件的行
4.isin()选择
5.query()
总结
前言
前一篇讲了Pandas库的安装和两种对象的创建以及一些基础方法:
Numpy&Pandas:pandas库的安装,Pandas(0-25%)-CSDN博客
今天接着来讲Pandas库后续内容(25%-50%)
一、列操作
- citys:
1.修改变量列
- columns修改
# 修改变量列
citys.columns = ['ar','pp']
# citys.columns
citys # 直接改变原数据
输出:
- rename修改
city = citys.rename(columns = {'ar':'area','pp':'population'},inplace = False)
citys # inplace = Fasle 则原数据列名不变 = True 则原数据列名改变
# citys.columns
city # 接收之后的列名改变
输出:注意inplace参数的使用
2.筛选变量列
- 取一列和取多列
# 筛选变量列
print(citys.ar) # 取一列
print(citys['ar'])
citys[['ar','pp']] # 取多列 内部用列表
输出:
3.删除变量列
- 先新增一列,不是说删除变量列必须先新增,是这里的数据框列数太少了,新增后看着更直观
citys['aaa'] = citys['ar'].rank(ascending=False)
citys
输出:
- 删除变量列
# 删除变量列
citys.drop(columns = ['aaa']) # 删除单列
citys.drop(columns = ['aaa','ar']) # 删除多列 输出了即原数组没有被改变
输出:一旦代码运行之后输出了,就说明元数据并没有被更改
4.添加变量列
- 根据新数据添加和根据原数据添加
# 添加变量列
citys['pp_rank'] = pd.Series([1,2,3,'NaN'],['beijing','shanghai','guangzhou','tianjin'])
# 根据新数据添加
citys['ok'] = pd.Series(np.arange(4),index = ['beijing','shanghai','guangzhou','tianjin'])
# ok列原索引是 0 1 2 3 与citys索引不符 所以必须得加上index 如果没加的话ok列全为NaN
# pp_rank 列也是如此
citys['sum'] = citys['ar']+citys['pp'] # 根据原数据添加 NaN跟任何数字进行算术操作 结果通常都是NaN
citys
输出:
二、数据类型的转换
1.查看数据类型
# 查看数据类型
citys.dtypes
输出:会输出每一列的数据类型,object可以看作str
2.将 ok的int类型转换成float类型
# 将 ok的int类型转换成float类型
citys['ok'] = citys['ok'].astype('float') # 用原列将修改后的列接收 不然原列不会更改
citys.dtypes
输出:跟上面的结果进行对比,会发现ok的数据类型被改为了float
3.将ar的float类型转换成int类型
# 将ar的float类型转换成int类型
citys['ar']=citys['ar'].astype('int',errors = 'ignore') # errors='raise'转换出错时抛出错误,'ignore'忽略
citys.dtypes # 因为ar列里有NaN 所以未转换成功
输出:因为ar列里有NaN,所以没有转换成功
三、建立索引
1.建立DataFrame时建立索引
# 建立DataFrame时建立索引 以字典的形式给定列名和每行的值 每行的值数量须一致
df = pd.DataFrame( {'varl' : 1.0, ' var2' :[1,2,3,4], 'var3' : ['test', 'python','test','hello'] , 'var4' : 'cons'} , index =[1,2,3,4])
df
输出:以字典的形式给定列名和每行的值 每行的值数量须一致
2.在读入数据时建立索引
# 在读入数据时建立索引 index_col= 指定哪一列或者多列当做索引
df_stu = pd.read_csv('./students.csv',header=None,names=['id','name','age','gender','clazz'],index_col=['id','name'])
print(df_stu)
# df_stu['id'] # id变成行索引 不能当做列名使用 会报错
df_stu['age']
输出:
输出单列时:因为id name 都被用来当做行索引了
3.指定某列或者多列为索引列
# 指定某列或者多列为索引列
stu = pd.read_csv('./students.csv',header = None).set_index([0,1])
stu
输出:默认的列名中0 1 被指定为索引列
4.将索引还原变量列
# 将索引还原变量列
pp = stu.reset_index(drop = True) # drop=True 会将原索引直接删除
print(pp)
stu.reset_index() # 将索引还原变量列 以默认值作为行索引
输出:drop=True 将原索引的id和name直接删除
输出:reset_index() 将索引还原变量列 以默认值作为行索引
四、引用和修改索引
- citys:
1.引用索引
# 引用索引
citys.index
输出:
Index(['beijing', 'guangzhou', 'shanghai', 'tianjin'], dtype='object')
2.修改索引名
# 修改索引名
# 本质上和变量列名的修改方式相同
citys.index.name = 'citys' # 将这个df数据的索引命名为citys
citys
输出:
3.修改索引值
# 修改索引值
# 这里的修改本质上是全部替换
citys.index = ['bj','gz','sh','tj']
citys
输出:
4.更新索引
可以自定义索引的排列顺序
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data, index=['a', 'b', 'c'])
print(df)
# 使用 reindex 重新排列索引
new_index = ['c', 'b', 'a', 'd']
df_reindexed = df.reindex(new_index)
print(df_reindexed)
输出:可以看到,前后数据框的行索引名改变了。同时还新增了一行,但是新增元数据框没有的索引名,会用NaN进行填充。
五、Series的索引和切片
- 建立一个Series对象
# Series的索引和切片
data=pd.Series([4,3,25,2,3],index=list('abcde'))
data
输出:
1.索引
# 索引
print(data[0]) # 根据索引值获取
print(data[-1])
print(data.c)
data['a'] # 根据索引名称获取
输出:
2.切片
# 切片
print(data['a':'b'])
print(data[0:2])
print(data[::-1])
print(data[data>3]) # 布尔取值 根据内部条件判断是True False 然后打印True
输出:
3.loc 和 iloc
# loc 和 iloc
data=pd.Series([5,3,2,5,9],index=[1,2,3,4,5])
print(data)
print(data.loc[1]) # 通过行的名称获取 名称索引
print(data.iloc[1]) # 通过行的索引值获取 即位置索引
输出:loc通过行的名称获取值 ,iloc通过行的位置获取值
六、DataFrame的索引和切片
- citys
1.选择列
# 选择列
print(citys['ar']) # 获取一列
print(citys[['pp','aaa']]) # 获取多列
citys
输出:
2.选择行
- 取出单行
# 按行索引选择
print(citys.loc['bj'],'\n') # 按行名称索引
print(citys.iloc[0],'\n') # 按行位置索引
输出:loc和iloc的用法和Series对象一致
- 取出一列的所有行
print(citys.loc[:,'ar'],'\n') # 取出指定名称的列的所有行
print(citys.iloc[:,0]) # 取出指定位置的所有行
输出:
- 取出指定行,指定列
# 注意前后类型的统一 名称行索引对应名称列索引 位置行索引对应位置列索引
print(citys.loc[['bj','tj'],['ar','pp']]) # 获取指定名称的多行的指定多列
print(citys.iloc[[0,1,2],[0,1,2]]) # 获取指定位置的多行的指定多列
输出:
3.获取满足条件的行
# pandas里的与或非分别用 & | ~ 表示
print(citys[citys['ar']>100]) # 单条件布尔取值
citys[(citys['ar']>100) & (citys['pp']>1500)] # 多条件布尔取值
输出:pandas里的与或非分别用 & | ~ 表示
4.isin()选择
data = {
'var1': [1, 1, 1, 1],
'var2': [1.0, 1.0, 1.0, 1.0],
'var3': [1, 2, 3, 4],
'var4': ['test', 'python', 'test', 'hello'],
}
df = pd.DataFrame(data)
df
print(df[ df.var4.isin(['test','hello'])],'\n') # 取出含有相应字符串的行
result = df[df['var3'].isin([2, 3, 4])] # 取出var3列含有2 3 4 的行
print(result)
输出:
5.query()
# query()的使用
data = {'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12]}
df = pd.DataFrame(data)
df.index = ['val1', 'val2', 'val3', 'val4']
df
- 单个条件
result = df.query('A > 2') # 取出 'A'列中值大于2的行
result
输出:
- 使用@引入变量
a = 2
result = df.query('A > @a') # 使用@引入变量
result
输出:
- 使用多个判断条件
result = df.query('A > 2 and B < 8') # 使用多个判断条件
result
输出:
总结
以上就是今天的全部内容,大概占pandas库的四分之一,下一篇将会把剩下的全部更新完。
pandas库的内容很多,要多多练习才能熟练掌握。