一、認識
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)