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>
col1 | col2 | col3 | col4 | |
---|---|---|---|---|
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>
School | Class | ID | Gender | Address | Height | Weight | Math | Physics | |
---|---|---|---|---|---|---|---|---|---|
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>