pandas数据处理基础部分

一、认识

1、pandas 主要是用来进行数据处理的库,里面不仅包含了数据处理、甚至还有 统计分析、相关计算,其内部封装了numpy 相关组件

2、结构三种形式:series(一维)、dataframe(二维)、pannel(三维)

二、基础使用

1、加载数据

res = np.load("./国民经济核算季度数据.npz", allow_pickle=True)
 

2、获取数据

columns = res['columns']
values = res['values']

print("columns:\n", columns)
print("values:\n", values)
 

3、数组拼接

# 数组拼接
data = np.concatenate(([columns],values),axis=0)
print(data)
print("*"*50)

4、将数组转化为dataframe(多了行,列索引)

index = ["index_" + str(i) for i in np.arange(69)]
df = pd.DataFrame(values, columns=columns, index=index)
print(df)
print(type(df))

5、获取时间 之后再获取前5行

# se = df['时间'][:5]
# se = df['时间'][['index_0','index_1','index_2']]
se = df['时间'][[0, 1, 2, 3, 4, 5]]  # 先获取时间这列,然后再获取序号为[0,1,2,3,4,5]的这6行
print(se)

6、将df 转化为series(只有行索引)

se = df['时间']
print(se)

7、自己生成一个df

d = {'col1': [0, 1, 2], 'col2': [1, 2, 3], 'col3': [1, 2, 3]}
# #
df = pd.DataFrame(data=d, index=['h', 'g', 'k'])
print(df)
print(type(df))

#拿取多列
res = df[['col1','col2']]
# print(res)

8、自己生成一个series

se = pd.Series([1, 2, 3],index=['k','l','o'])

print(se)
print(type(se

二、dataframe属性

import pandas as pd

# 自己创建一个df
df = pd.DataFrame({
    'col1': [0, 1, 2],
    'col2': ["zs", 'li', 'zl'],
    'col3': [3.14, 5.20, 6.78]
},
    index=['index0', 'index1', 'index2'])
print(df)
print(type(df))

# 查看dataframe 属性
print("df 的values:\n", df.values)  # 获取df的数组
print("df 的values的类型:\n", type(df.values))
print("df 的index:\n", df.index)  # 获取行索引名称
print("df 的columns:\n", df.columns)  # 获取列索引名称
print("df 的size:\n", df.size)  # 获取元素个数
print("df 的itemsize:\n", df.itemsize)  # df 没有这个属性
print("df 的dtypes:\n", df.dtypes)  # 每一列的数据类型
print("df 的shape:\n", df.shape)  # 获取df形状,以元组显示
print("df 的ndim:\n", df.ndim)  # 获取df维度----df  是2维的 没有别的维度

三、数据操作

1、数据存储与读取

(1)read_table

## 读取数据
info = pd.read_table("./meal_order_info.csv", encoding='ansi', sep=',', )  # 默认\t 分隔的
# 参数介绍
"""
header = info  自动识别列名  自动认为第一行是列名
index_col  设置行索引,如【0,1】是将第0列、第一列作为行索引
index_col=[0,1]
nrows  读取的时候读取前N 行
usecols ---指定读取的列
usecols=['info_id','emp_id']

"""

(2)read_csv

## 读取数据
info = pd.read_csv("./meal_order_info.csv", encoding='ansi')  # csv 默认是逗号分隔

# 参数介绍
"""
excel 文件读取 ---以.xlsx ,.xls结尾的文件被称为excel文件
header  以哪一行作为列名
index_col  同read_csv 中的index_col
names 同read_csv 中的names
parse_cols 还是在某些版本中作用

"""

(3)read_excel

detail = pd.read_excel("./meal_order_detail.xlsx", sheetname=0)
print("detail:\n", detail)
print(type(detail))

(4)数据保存

参数介绍:

  • columns :指定需要保存的列
  • header :保存列索引
  • index : 保存行索引
  • index_label :给保存好的excle文件的行索引起个名称

保存为excel文件

detail = pd.read_excel("./meal_order_detail.xlsx", sheetname=0)

detail.to_excel("./hh.xlsx",header=True,index=False)

保存为csv文件

detail = pd.read_excel("./meal_order_detail.xlsx", sheetname=0)
detail.to_csv("./hh.csv", header=True)

2、dataframe数据索引

import pandas as pd

# 加载数据
detail = pd.read_excel("./meal_order_detail.xlsx")
print("detail :\n", detail)
print("detail的形状:\n", detail.shape)
print("detail的列索引:\n", detail.columns)

print("*" * 80)

#  先取列 再 取行----非同时索引,
# 数组是同时索引arr[行,列]
# 获取detail_id 之后再获取前5行
# se = detail['detail_id'][:5]
# 先获取detail_id这列,然后再拿取名称为[0,1,2,3,4]的这5行数据,也可以使用这几行的下标来获取
# se = detail['detail_id'][[0,1,2,3,4]]
# se = detail['detail_id'].head() # head 默认获取前5行
# se = detail['detail_id'].head(10) # head 获取前10行

# 获取detail_id 之后再获取后5行
# se = detail['detail_id'][-5:] # 切片
# se = detail['detail_id'].tail() # tail  默认获取后5行
# se = detail['detail_id'].tail(10) # tail  获取后10行
# 获取单列 之后再获取行数据,单行的名称或者下标,
# 多行的名称列表 或者 下标列表
# print(se)
# 获取多列之后再获取行
# 如果是单列,直接写名称,如果是多列,需要将多列的名称组成一个列表
# df = detail[['detail_id','order_id']].head()
# df = detail[[0,1]].head() # 错误的,不能使用列的下标,只能使用列的名称
# print(df)

# loc iloc 索引方式 ---同时索引
# detail.loc[行名称,列名称]
# detail.iloc[行下标,列下标]
#  单列 或者单行 直接写名称,如果是多列或者多行,需要用列表装起来
# res = detail.loc[[0,1,2,3,4],['detail_id','order_id']]
#  也能使用切片,从名称切到名称,包含首尾
res = detail.loc[0:5, 'detail_id':'dishes_id']
# 获取单行单列  直接放下标
# 获取多行多列,需要将行下标、列下标分别组成列表传进去
# res = detail.iloc[0,0]
# res = detail.iloc[:,[11,12]]
# print(res)

#  ix --混合索引---既可以使用名称也可以使用下标的索引方式
# res1 = detail.ix[0:5,['discount_amt','discount_reason']]
#  ix  在行的维度上可以使用名称,在列的维度上也可以使用名称
#  ix  在行的维度上可以使用下标,在列的维度上也可以使用下标
# res1 = detail.ix[[0,1,2,3,4,5],0:1]
# # res1 = detail.ix[[0,1,2,3,4,5],0:'discount_reason'] # 错误的,可以混合,但是不能混搭
# print(res)
# print("********")
# print(res1)

# 从效率上来说,ix 最慢,如果数据特别大,不推荐使用

3、dataframe数据的增删改

(1)增加

import pandas as pd

# 加载数据
users = pd.read_excel("./users.xlsx")
print("users:\n", users)
print("users的列名称:\n", users.columns)
print('*' * 80)
# 给users  用户来新增一个next_year_age列
users.loc[:, 'next_year_age'] = users.loc[:, 'age'] + 1
#  给df 增加一列  直接添加列名,给列名下面赋值
print(users)

(2)删除

import pandas as pd

# 加载数据
users = pd.read_excel("./users.xlsx")
print("users:\n", users)
print("users的列名称:\n", users.columns)
print(users.shape)
print('*' * 80)

# drop
#  删除列  labels 指定列名   axis = 1  必须成对出现
# res = users.drop(labels=['sex','age'],axis=1,inplace=True)
# res = users.drop(labels=['sex','age'],axis=1,inplace=False)
# inplace = True 对原df 产生影响,返回一个None
# inplace = False 对原df 不产生影响,返回删除之后的结果
# print("res:\n",res)
# print(users.shape)

#  删除 行 labels  指定行名  axis = 0 必须成对出现
# res = users.drop(labels=[0,1,2,3,4,5],axis=0,inplace=False)
# print("res:\n",res)
# print(users.shape)

#  删除 age 为偶数的行
bool_id = users.loc[:, 'age'] % 2 == 0
# 获取age 为偶数的行的行名称
res = users.loc[bool_id, :].index
# print(res)

users.drop(labels=res, axis=0, inplace=True)

print(users.shape)

(3)修改

import pandas as pd

# 加载数据
users = pd.read_excel("./users.xlsx")
print("users:\n", users)
print("users的列名称:\n", users.columns)
print('*' * 80)
# #  定位到sex 这一列数据
# res =  users.loc[:,'sex'] == '男'
# # print(res)
# #
# # print("*"*80)
# 获取到所有sex == '男'的 这些数据
# data = users.loc[res,'sex']
# print(data)
# print("*"*80)

# #重新赋值
# users.loc[res,'sex'] = 'nan'
# print(users)
# print("*"*80)

# 如果不加条件的更改
# users.loc[:,'sex'] = '0'
#
# print(users)


# print(res)

# 对于奇数的age 更改为0
# 1、找到age =='奇数'行---bool 数组
# bool_age = users.loc[:,'age'] % 2 != 0
#
# users.loc[bool_age,'age'] = 0
#
# print(users)

# 把users  中的ORGANIZE_NAME  的统计班 改为0506
bool_name = users.loc[:,'ORGANIZE_NAME'] == '统计班'
users.loc[bool_name,'ORGANIZE_NAME'] ='0506'
print(users)

猜你喜欢

转载自blog.csdn.net/qq_40576301/article/details/102457785
今日推荐