1. 程式人生 > 實用技巧 >3.5.1 pandas基礎

3.5.1 pandas基礎

1.匯入三方庫

import numpy as np
import pandas as pd

檢視庫的版本

pd.__version__

'1.0.5'

2.資料檔案的匯入和匯出

1)xlsx檔案

shuju_xlsx = pd.read_excel('table.xlsx')
shuju_xlsx2 = pd.read_excel('視覺化圖表案例資料.xlsx')
shuju_xlsx4 = pd.read_excel('視覺化圖表案例資料.xlsx',sheet_name='條形圖')

2)csv檔案

shuju_csv = pd.read_csv('table.csv')

3)txt檔案

shuju_txt = pd.read_table('table.txt')
shuju_txt

​ ​
.dataframe tbody tr th {
vertical-align: top;
}

.dataframe thead th {
text-align: right;
}

</style>

col1col2col3col4
0 2 a 1.4 apple
1 3 b 3.4 banana
2 6 c 2.5 orange
3 5 d 3.2 lemon

</div>

shuju_txt2 = pd.read_table('citydata.txt',sep='\s+')

3.基本資料結構

1)Series 常用的屬性有:值(values)、索引(index)、名字(name)、型別(dtype)

se = pd.Series(np.random.randint(60,100,(8)),index=['s','e','q','b','a','s','h','t'],name='模擬學生成績',dtype='int32')

se

s    69
e    96
q    74
b    88
a    66
s    73
h    97
t    64
Name: 模擬學生成績, dtype: int32

se['e']

96

se['s']

s    69
s    73
Name: 模擬學生成績, dtype: int32

2)DataFrame

a)建立DataFrame

DF = pd.DataFrame({'字母':list('abcdefgh'),'編號':range(5,13),'分值':[1.3,1,3.6,4.6,18,9.1,11,11.111]},
                  index=list('一二三四五六七八'))

DF

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

字母編號分值
a 5 1.300
b 6 1.000
c 7 3.600
d 8 4.600
e 9 18.000
f 10 9.100
g 11 11.000
h 12 11.111

</div>

b)從DataFrame中取出一列

DF[['編號','分值']]

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

編號分值
5 1.300
6 1.000
7 3.600
8 4.600
9 18.000
10 9.100
11 11.000
12 11.111

</div>

c)修改行或列名

修改列名

DF.rename(columns={'asd':'字母','shuzi':'編號','帶小數點的資料':'分值'})

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

字母編號分值
a 5 1.300
b 6 1.000
c 7 3.600
d 8 4.600
e 9 18.000
f 10 9.100
g 11 11.000
h 12 11.111

</div>

#1.與直接資料提供人或者資料匯出者對接
#2.1)讓對方自行內部溝通,等待結果;2)嘗試獲取或切入對方的資料錄入環節

修改行名

DF.rename(index={'一':'numberone'},inplace=True)

DF

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

字母編號分值
numberone a 5 1.300
b 6 1.000
c 7 3.600
d 8 4.600
e 9 18.000
f 10 9.100
g 11 11.000
h 12 11.111

</div>

d)呼叫屬性和方法

DF.values

array([['a', 5, 1.3],
       ['b', 6, 1.0],
       ['c', 7, 3.6],
       ['d', 8, 4.6],
       ['e', 9, 18.0],
       ['f', 10, 9.1],
       ['g', 11, 11.0],
       ['h', 12, 11.111]], dtype=object)

DF.index

Index(['numberone', '二', '三', '四', '五', '六', '七', '八'], dtype='object')

DF.columns

Index(['字母', '編號', '分值'], dtype='object')

e)列的刪除和新增

列的刪除

DF.drop(index='五',columns='字母') #使用引數inplace=True才會在DataFrame中生效

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

編號分值
numberone 5 1.300
6 1.000
7 3.600
8 4.600
10 9.100
11 11.000
12 11.111

</div>

del DF['字母'] #執行後改動就會生效
DF

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

編號分值
numberone 5 1.300
6 1.000
7 3.600
8 4.600
9 18.000
10 9.100
11 11.000
12 11.111

</div>

列的新增

DF

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

編號分值
numberone 5 1.300
6 1.000
7 3.600
8 4.600
9 18.000
10 9.100
11 11.000
12 11.111

</div>

DF['新增的列'] = DF['編號'] + DF['分值']
DF

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

編號分值新增的列
numberone 5 1.300 6.300
6 1.000 7.000
7 3.600 10.600
8 4.600 12.600
9 18.000 27.000
10 9.100 19.100
11 11.000 22.000
12 11.111 23.111

</div>

f)根據型別選擇列

DF.select_dtypes(include=['number'])

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

編號分值新增的列
numberone 5 1.300 6.300
6 1.000 7.000
7 3.600 10.600
8 4.600 12.600
9 18.000 27.000
10 9.100 19.100
11 11.000 22.000
12 11.111 23.111

</div>

DF.select_dtypes(include=['object'])

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

numberone

</div>

4.常用基本函式

匯入資料檔案

csv_shuju = pd.read_csv('table.csv')

a)head和tail

csv_shuju.head()

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

SchoolClassIDGenderAddressHeightWeightMathPhysics
0 S_1 C_1 1101 M street_1 173 63 34.0 A+
1 S_1 C_1 1102 F street_2 192 73 32.5 B+
2 S_1 C_1 1103 M street_2 186 82 87.2 B+
3 S_1 C_1 1104 F street_2 167 81 80.4 B-
4 S_1 C_1 1105 F street_4 159 64 84.8 B+

</div>

csv_shuju.rename(columns={'School':'學校','Class':'班級','ID':'學生ID','Gender':'性別',
                          'Address':'地址','Height':'身高','Weight':'體重','Math':'數學成績','Physics':'物理成績'},inplace=True)
csv_shuju.head(1) #預設顯示5行

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

學校班級學生ID性別地址身高體重數學成績物理成績
0 S_1 C_1 1101 M street_1 173 63 34.0 A+

</div>

csv_shuju.tail(2) #預設顯示5行

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

學校班級學生ID性別地址身高體重數學成績物理成績
33 S_2 C_4 2404 F street_2 160 84 67.7 B
34 S_2 C_4 2405 F street_6 193 54 47.6 B

</div>

b)unique和nunique

csv_shuju['性別'].nunique() #nunique顯示該欄位裡有多少個唯一值

2

csv_shuju['性別'].unique() #unique顯示該欄位裡所有的唯一值

array(['M', 'F'], dtype=object)

c)count和value_counts

csv_shuju['地址'].count() #返回非缺失值元素的個數

35

csv_shuju['物理成績'].value_counts() #返回每個元素的頻數(有多少個)
#不太適合交易額、銷量、分值

B+    9
B     8
B-    6
A     4
A-    3
A+    3
C     2
Name: 物理成績, dtype: int64

d)info和describe

csv_shuju.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 35 entries, 0 to 34
Data columns (total 9 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   學校      35 non-null     object 
 1   班級      35 non-null     object 
 2   學生ID    35 non-null     int64  
 3   性別      35 non-null     object 
 4   地址      35 non-null     object 
 5   身高      35 non-null     int64  
 6   體重      35 non-null     int64  
 7   數學成績    35 non-null     float64
 8   物理成績    35 non-null     object 
dtypes: float64(1), int64(3), object(5)
memory usage: 2.6+ KB

csv_shuju.describe() #統計數值型資料的各個統計量

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

學生ID身高體重數學成績
count 35.00000 35.000000 35.000000 35.000000
mean 1803.00000 174.142857 74.657143 61.351429
std 536.87741 13.541098 12.895377 19.915164
min 1101.00000 155.000000 53.000000 31.500000
25% 1204.50000 161.000000 63.000000 47.400000
50% 2103.00000 173.000000 74.000000 61.700000
75% 2301.50000 187.500000 82.000000 77.100000
max 2405.00000 195.000000 100.000000 97.000000

</div>

csv_shuju.describe(percentiles=[.05,.25,.75,.95])

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

學生ID身高體重數學成績
count 35.00000 35.000000 35.000000 35.000000
mean 1803.00000 174.142857 74.657143 61.351429
std 536.87741 13.541098 12.895377 19.915164
min 1101.00000 155.000000 53.000000 31.500000
5% 1102.70000 157.000000 56.100000 32.640000
25% 1204.50000 161.000000 63.000000 47.400000
50% 2103.00000 173.000000 74.000000 61.700000
75% 2301.50000 187.500000 82.000000 77.100000
95% 2403.30000 193.300000 97.600000 90.040000
max 2405.00000 195.000000 100.000000 97.000000

</div>

csv_shuju['物理成績'].describe()

count     35
unique     7
top       B+
freq       9
Name: 物理成績, dtype: object

e)idxmax和nlargest

idxmax

csv_shuju['數學成績'].idxmax() #返回最大值所在行的索引

5

csv_shuju[5:9]

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

學校班級學生ID性別地址身高體重數學成績物理成績
5 S_1 C_2 1201 M street_5 188 68 97.0 A-
6 S_1 C_2 1202 F street_4 176 94 63.5 B-
7 S_1 C_2 1203 M street_6 160 53 58.8 A+
8 S_1 C_2 1204 F street_5 162 63 33.8 B

</div>

csv_shuju['數學成績'].idxmin() #返回最小值所在行的索引

10

csv_shuju[10:20]

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

學校班級學生ID性別地址身高體重數學成績物理成績
10 S_1 C_3 1301 M street_4 161 68 31.5 B+
11 S_1 C_3 1302 F street_1 175 57 87.7 A-
12 S_1 C_3 1303 M street_7 188 82 49.7 B
13 S_1 C_3 1304 M street_2 195 70 85.2 A
14 S_1 C_3 1305 F street_5 187 69 61.7 B-
15 S_2 C_1 2101 M street_7 174 84 83.3 C
16 S_2 C_1 2102 F street_6 161 61 50.6 B+
17 S_2 C_1 2103 M street_4 157 61 52.5 B-
18 S_2 C_1 2104 F street_5 159 97 72.2 B+
19 S_2 C_1 2105 M street_4 170 81 34.2 A

</div>

nlargest

csv_shuju['數學成績'].nlargest() #返回前幾個大的元素值及其索引

5     97.0
28    95.5
11    87.7
2     87.2
24    85.4
Name: 數學成績, dtype: float64

csv_shuju['數學成績'].nsmallest() #返回前幾個小的元素值及其索引

10    31.5
1     32.5
26    32.7
8     33.8
0     34.0
Name: 數學成績, dtype: float64

e)clip和replace

clip:對超過或低於指定值的資料進行擷取

csv_shuju['數學成績'].clip(31,50).head()

0    34.0
1    32.5
2    50.0
3    50.0
4    50.0
Name: 數學成績, dtype: float64

replace:對指定值進行替換

csv_shuju['地址'].replace(['street_1','street_2','street_4'],['one','two','fouth'],inplace=True)
csv_shuju.head(10)

​ ​
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

學校班級學生ID性別地址身高體重數學成績物理成績
0 S_1 C_1 1101 M one 173 63 34.0 A+
1 S_1 C_1 1102 F two 192 73 32.5 B+
2 S_1 C_1 1103 M two 186 82 87.2 B+
3 S_1 C_1 1104 F two 167 81 80.4 B-
4 S_1 C_1 1105 F fouth 159 64 84.8 B+
5 S_1 C_2 1201 M street_5 188 68 97.0 A-
6 S_1 C_2 1202 F fouth 176 94 63.5 B-
7 S_1 C_2 1203 M street_6 160 53 58.8 A+
8 S_1 C_2 1204 F street_5 162 63 33.8 B
9 S_1 C_2 1205 F street_6 167 63 68.4 B-

</div>