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)

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章