pandas
1、表格資料的操作:【增刪改查】
2、實作多個表格的處理
3、資料清洗操作:例外值、缺失值、重復值、資料標準化、資料轉化的操作
4、實作excel的特殊操作:生成透視表、交叉表
5、完成統計分析
import pandas as pd
import numpy as np
一、構建dataframe
dataframe一定是二維的
df=pd.DataFrame(data=[['ss',20,'男','0831'],['lx',18,'女','0830'],['lx',22,'女','0830']],
index=['a','c','b'],
columns=['name','age','gender','class'])
print(df)
name age gender class
a ss 20 男 0831
c lx 18 女 0830
b lx 22 女 0830
創建方法二:
df2=pd.DataFrame(data={'name':['ss','lx'],
'age':[20,18],
'sex':['男','女'],
'class':['0831','0830']})
print(df2)
name age sex class
0 ss 20 男 0831
1 lx 18 女 0830
二、dataframe屬性
print('df的結構:',df.shape)
print('df的維度:',df.ndim)
print('df的元素個數:',df.size)
print('df的資料型別:\n',df.dtypes)
print('df的列索引:',df.columns)
print('df的行索引:',df.index)
print('df的元素:',df.values)
df的結構: (3, 4)
df的維度: 2
df的元素個數: 12
df的資料型別:
name object
age int64
gender object
class object
dtype: object
df的列索引: Index(['name', 'age', 'gender', 'class'], dtype='object')
df的行索引: Index(['a', 'c', 'b'], dtype='object')
df的元素: [['ss' 20 '男' '0831']
['lx' 18 '女' '0830']
['lx' 22 '女' '0830']]
三、dataframe的查找
series是一維的型別,只有一個軸,只能取一列
1、切一列值的方法
# 一維的切法,回傳的是series型別
ser=df['name']
# print(type(ser)) # <class 'pandas.core.series.Series'>
print(ser)
a ss
c lx
b lx
Name: name, dtype: object
2、切多列值的方法
df[['name','age']]
| name | age | |
|---|---|---|
| a | ss | 20 |
| c | lx | 18 |
| b | lx | 22 |
3、索引:df.loc[行索引名稱/條件,列的索引名稱]
df[['name','age']][:2] # 索引不能用負數切,當自己知道是第幾行可以這么切
| name | age | |
|---|---|---|
| a | ss | 20 |
| c | lx | 18 |
df.loc['a','name']
'ss'
df.loc['a',:] # 一維的series型別
name ss
age 20
gender 男
class 0831
Name: a, dtype: object
# 只有當行和列傳的索引數量都大于1才是二維的
df.loc[['a','b'],['name','age']]
| name | age | |
|---|---|---|
| a | ss | 20 |
| b | lx | 22 |
# 左閉右閉 b是名稱,但是如果有兩個b,那么就不能用:'b'來切
print(df.loc[:'b','name'])
a ss
c lx
b lx
Name: name, dtype: object
4、條件切片
獲取所有年齡大于18的同學
mask=df['age']>18
print(mask)
a True
c False
b True
Name: age, dtype: bool
df.loc[mask,'name']
a ss
b lx
Name: name, dtype: object
# mask1=df['name']=='lx'
# print(mask1)
# mask2=df['age']>18
# print(mask2)
# mask3=mask1&mask2
# print(mask3)
df.iloc[行的位置索引,列的位置索引]
這個傳的就是平時的索引了,前閉后開
print(df)
name age gender class
a ss 20 男 0831
c lx 18 女 0830
b lx 22 女 0830
df.iloc[:,1]
a 20
c 18
b 22
Name: age, dtype: int64
df.iloc[:2,2:]
| gender | class | |
|---|---|---|
| a | 男 | 0831 |
| c | 女 | 0830 |
df.iloc[-1,:]
name lx
age 22
gender 女
class 0830
Name: b, dtype: object
df.iloc[-1,:].index
Index(['name', 'age', 'gender', 'class'], dtype='object')
5、dataframe增加方法
(1)增加一列
df['address']=['北京','上海','廣州']
print(df)
name age gender class address
a ss 20 男 0831 北京
c lx 18 女 0830 上海
b lx 22 女 0830 廣州
df['address']='北京'
print(df)
name age gender class address
a ss 20 男 0831 北京
c lx 18 女 0830 北京
b lx 22 女 0830 北京
(2)增加一行
df_mini=pd.DataFrame(data={'name':['ss','lx'],
'age':[20,18],
'gender':['男','女'],
'class':['0831','0830']},
index=['a','b'])
df3=df.append(df_mini,ignore_index=True)
# ignore_index:表示忽略原始索引,重新設定索引
print(df3)
name age gender class address
0 ss 20 男 0831 北京
1 lx 18 女 0830 北京
2 lx 22 女 0830 北京
3 ss 20 男 0831 NaN
4 lx 18 女 0830 NaN
6、洗掉方法
drop沒有修改原表資料,有回傳值,
但是里面的inplace=True引數會修改原表,修改后沒有回傳值
刪完之后寬度變窄了,所以是沿著axis=1的方向操作
df3.drop(labels=['address','class'],axis=1)
df3.drop(labels=[0,1,2],axis=0,inplace=True)
print(df3)
name age gender class address
3 ss 20 男 0831 NaN
4 lx 18 女 0830 NaN
7、dataframe更改數值的方法
print(df)
name age gender class address
a ss 20 男 0831 北京
c lx 18 女 0830 北京
b lx 22 女 0830 北京
# 例:將名字為‘lx’的人的班級改為‘有問題’
df.loc[df['name']=='lx','class']='有問題'
print(df)
name age gender class address
a ss 20 男 0831 北京
c lx 18 女 有問題 北京
b lx 22 女 有問題 北京
四、統計分析
1、沿用numpy中的統計方法:
print(df)
name age gender class address
a ss 20 男 0831 北京
c lx 18 女 有問題 北京
b lx 22 女 有問題 北京
np.mean(df['age'])
20.0
np.sum(df['age'])
60
print('最小值',df['age'].min())
print('標準差',df['age'].std())
print('最大值索引',df['age'],argmax())
最小值 18
標準差 2.0
# 其他方法:
# 極差:max-min
np.ptp(df['age'])
4
2、pandas方法
(1)針對series型別
df4=df.append(df_mini,ignore_index=True)
# 眾數
df4['age'].mode()
0 18
1 20
dtype: int64
# 非空數目
df4['name'].count()
5
# 頻數統計
df4['name'].value_counts()
lx 3
ss 2
Name: name, dtype: int64
(2) 針對df型別
最大值、最小值、標準差、方差、眾數、非空數目,,,都是在一維和二維中通用的
value_counts()頻數統計僅在一維中有
argmax()僅在一維中有
idxmax()一維二維都可以使用
df4.min()
name lx
age 18
gender 女
class 0830
dtype: object
df4['grade']=[100,98,58,85,77]
# 最大值索引,axis=1,橫向比較
# axis=0,縱向比較
print(df4[['age','grade']].idxmax(axis=1))
print(df4[['age','grade']].idxmax(axis=0))
0 grade
1 grade
2 grade
3 grade
4 grade
dtype: object
age 2
grade 0
dtype: int64
總結:
一、series中的dataframe中通用的方法:
df.min()
df.max()
df.mean()
df.mode()眾數
df.std()
df.var()
df.idxmax(axis=0)
df.idxmin(axis=0)
df.count()非空數目
二、只用series中存在的方法;
ser.value_counts()頻數統計方法
三、df.describe()
'''
describe()作用在類別性df中回傳值:
count:非空數目
unique:去重之后有幾個值
top:眾數
freq:眾數出現的頻數
'''
print(df4[['name','gender']].describe())
name gender
count 5 5
unique 2 2
top lx 女
freq 3 3
# 都是數值型
print(df4[['age','grade']].describe())
age grade
count 5.00000 5.000000
mean 19.60000 83.600000
std 1.67332 17.155174
min 18.00000 58.000000
25% 18.00000 77.000000
50% 20.00000 85.000000
75% 20.00000 98.000000
max 22.00000 100.000000
# 當數值型和類別型放在一起 會過濾類別型
print(df[['age','name']].describe())
age
count 3.0
mean 20.0
std 2.0
min 18.0
25% 19.0
50% 20.0
75% 21.0
max 22.0
print(pd.DataFrame(data={'num':[1,2,4,5,5.5,6,7,8,8.5,10]}).describe())
num
count 10.000000
mean 5.700000
std 2.840188
min 1.000000
25% 4.250000
50% 5.750000
75% 7.750000
max 10.000000
五、excel檔案讀取
# pd.read_excel(r'路徑')
補充內容
1、series構建
series只有index索引,沒有columns索引
pd.Series(data=['lx','ss','zs'],index=[0,1,2])
0 lx
1 ss
2 zs
dtype: object
六、讀取excel資料:
sheet_name:切換sheet表格
1、 可以傳入int,表示從0開始的索引
2、可以傳入表名稱
3、 可以傳入None,表示一次性獲取所有表格
4、 可以傳入list,[‘sheetname’,2]這種混合的
data=pd.read_excel(r'D:\study\student\jupyter\meal_order_detail.xlsx',sheet_name=None)
# print(data)
print('查看當前表中所有sheet名稱:',list(data.keys()))
# print(data['meal_order_detail1']) # 當data是個字典的時候可以這么用,取第一個表
查看當前表中所有sheet名稱: ['meal_order_detail1', 'meal_order_detail2', 'meal_order_detail3']
2、header表示選擇哪一行作為列索引,默認是第一行(header=0)
當header不為0時,會將默認為列索引之前的行全部刪掉不讀
data=pd.read_excel(r'meal_order_detail.xlsx',header=[0,1])
# print(data)
3、當檔案中沒有給出表頭的時候,需要將header設定成None值,并且傳入與列數量一致的list,name=[ ]
data=pd.read_excel(r'meal_order_detail.xlsx',names=np.arange(19),header=None)
# print(data)
4、skiprows:跳過行
data=pd.read_excel(r'meal_order_detail.xlsx',skiprows=[1,10],header=0) # 跳過1和10行,不是1到10行
# print(data)
print(data.head(6)) # 從頭開始讀,展示前6行,head不寫數字默認取5
# print(data.tail(5)) # 從后開始讀,展示后5行
七、讀取csv檔案
1、csv屬于文本檔案,逗號分隔符檔案,編碼一般為gbk;
2、read_csv方法中引數說明:
(1)sep:元素分隔符,csv檔案中默認分隔符為逗號;
(2)engine:底層編譯方式,默認為C語言,如果遇到編碼問題,可以嘗試將engine改為python;
order=pd.read_csv(r'meal_order_info.csv',
sep=',',
encoding='gbk',
engine='python')
print(order.head())
讀取文本檔案的方法:.txt、.csv
讀取txt和之前numpy的一樣
pd.read_table(r'meal_order_info.csv',
sep=',',
encoding='gbk',
engine='python')
保存檔案
order.to_excel('1.xlsx')
想保存什么格式的,就to_什么
order.to_excel('1.xlsx')
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/242891.html
標籤:python
下一篇:pandas 資料讀取與保存
