Pandas 是 Python 语言的一个扩展程序库,用于数据分析。
Pandas 名字衍生自术语 “panel data”(面板数据)和 “Python data analysis”(Python 数据分析)。
Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。
Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。
Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。
Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。
Pandas 主要引入了两种新的数据结构:DataFrame 和 Series。
DataFrame: 类似于一个二维表格,它是 Pandas 中最重要的数据结构。DataFrame 可以看作是由多个 Series 按列排列构成的表格,它既有行索引也有列索引,因此可以方便地进行行列选择、过滤、合并等操作。
DataFrame 可视为由多个 Series 组成的数据结构:
Pandas 提供了丰富的功能,包括:
Pandas 在数据科学和数据分析领域中具有广泛的应用,其主要优势在于能够处理和分析结构化数据。
以下是 Pandas 的一些主要应用领域:
Pandas 在许多领域中都是一种强大而灵活的工具,为数据科学家、分析师和工程师提供了处理和分析数据的便捷方式。
- Pandas 官网 https://pandas.pydata.org/
- Pandas 源代码:https://github.com/pandas-dev/pandas
pip install pandas
查看pandas版本
import pandas as pd
pd.__version__
'1.4.4'
Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。
Series 特点:
索引: 每个 Series
都有一个索引,它可以是整数、字符串、日期等类型。如果没有显式指定索引,Pandas 会自动创建一个默认的整数索引。
数据类型: Series
可以容纳不同数据类型的元素,包括整数、浮点数、字符串等。
Series 是 Pandas 中的一种基本数据结构,类似于一维数组或列表,但具有标签(索引),使得数据在处理和分析时更具灵活性。
pandas.Series( data, index, dtype, name, copy)
参数说明:
示例:
a=[1,2,3]
mySeries=pd.Series(a)
print(mySeries)
print(mySeries[1])
2
a=["numpy","pandas","matplotlib"]
mySeries=pd.Series(a,index=["x","y","z"])
print(mySeries)
x numpy
y pandas
z matplotlib
dtype: object
print(mySeries["y"])
pandas
sites={1:"numpy",2:"pandas",3:"matplotlib"}
mySeries=pd.Series(sites)
print(mySeries)
1 numpy
2 pandas
3 matplotlib
dtype: object
sites={1:"numpy",2:"pandas",3:"matplotlib"}
mySeries=pd.Series(sites,index=[1,2])
print(mySeries)
1 numpy
2 pandas
dtype: object
sites={1:"numpy",2:"pandas",3:"matplotlib"}
mySeries=pd.Series(sites,index=[1,2],name="python-Series")
print(mySeries)
1 numpy
2 pandas
Name: python-Series, dtype: object
sites={1:"numpy",2:"pandas",3:"matplotlib",4:"pyechart"}
mySeries=pd.Series(sites,name="python-Series")
print(mySeries)
print('---------1---------')
#获取值
value=mySeries[2]
print(value)
print('---------2---------')
#获取多个值 左开右闭
subset=mySeries[1:3]
print(subset)
print('---------3---------')
#使用自定义索引
a=["numpy","pandas","matplotlib"]
mySeries_with_index=pd.Series(a,index=["x","y","z"])
print(mySeries_with_index["x"])
print('---------4---------')
#打印索引和值的对应关系 items获取Series的键和值
for index, value in mySeries_with_index.items():
print(f"Index:{index},Value:{value}")
1 numpy
2 pandas
3 matplotlib
4 pyechart
Name: python-Series, dtype: object
---------1---------
pandas
---------2---------
2 pandas
3 matplotlib
Name: python-Series, dtype: object
---------3---------
numpy
---------4---------
Index:x,Value:numpy
Index:y,Value:pandas
Index:z,Value:matplotlib
#算术运算
# a=[1,2,3,4]
# mySeries=pd.Series(a)
#如果values的值非数字
print(mySeries)
print('---------1---------')
#所有元素乘以2
result=mySeries*2
print(result)
print('---------2---------')
#过滤 首字母比较小于“p”
filter_series=mySeries[mySeries<"p"]
print(filter_series)
print('---------3---------')
1 numpy
2 pandas
3 matplotlib
4 pyechart
Name: python-Series, dtype: object
---------1---------
1 numpynumpy
2 pandaspandas
3 matplotlibmatplotlib
4 pyechartpyechart
Name: python-Series, dtype: object
---------2---------
1 numpy
3 matplotlib
Name: python-Series, dtype: object
---------3---------
#算术运算 如果是数字,可以进行更多相关的运算
a=[1,2,3,4]
mySeries=pd.Series(a)
#如果values的值非数字
print(mySeries)
print('---------1---------')
#所有元素乘以2
result=mySeries*2
print(result)
print('---------2---------')
#过滤 大于2的元素
filter_series=mySeries[mySeries>2]
print(filter_series)
print('---------3---------')
mysqrt = np.sqrt(mySeries) # 对每个元素取平方根
print(mysqrt)
0 1
1 2
2 3
3 4
dtype: int64
---------1---------
0 2
1 4
2 6
3 8
dtype: int64
---------2---------
2 3
3 4
dtype: int64
---------3---------
0 1.000000
1 1.414214
2 1.732051
3 2.000000
dtype: float64
a=[1,2,3,4]
mySeries=pd.Series(a)
#获取索引
index=mySeries.index
print(index)
print('---------1---------')
#获取值数组
value=mySeries.values
print(value)
print('---------2---------')
#获取描述统计信息 可以获取元素个数均值方差等相关属性值
stats=mySeries.describe()
print(stats)
print('---------3---------')
#获取最大值和最小值的索引
max_index=mySeries.idxmax()
print(f"max_index:{max_index}")
min_index=mySeries.idxmin()
print(f"max_index:{min_index}")
RangeIndex(start=0, stop=4, step=1)
---------1---------
[1 2 3 4]
---------2---------
count 4.000000
mean 2.500000
std 1.290994
min 1.000000
25% 1.750000
50% 2.500000
75% 3.250000
max 4.000000
dtype: float64
---------3---------
max_index:3
max_index:0
注意事项:
Series 中的数据是有序的。
可以将 Series 视为带有索引的一维数组。
索引可以是唯一的,但不是必须的。
数据可以是标量、列表、NumPy 数组等。
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
DataFrame 特点:
列和行: DataFrame
由多个列组成,每一列都有一个名称,可以看作是一个 Series
。同时,DataFrame
有一个行索引,用于标识每一行。
二维结构: DataFrame
是一个二维表格,具有行和列。可以将其视为多个 Series
对象组成的字典。
列的数据类型: 不同的列可以包含不同的数据类型,例如整数、浮点数、字符串等。
DataFrame 构造方法如下:
pandas.DataFrame( data, index, columns, dtype, copy)
参数说明:
data=[["gcc1",10],["gcc2",12],["gcc3",13]]
myDf=pd.DataFrame(data,columns=['Site','Age'],dtype=float)
print(myDf)
Site Age
0 gcc1 10.0
1 gcc2 12.0
2 gcc3 13.0
data2=np.array([4,1,3,2,5,2,4,3,6,3,5,4,7,4,6,5,8,5,7,6]).reshape(5,4)
print('利用ndarrays创建dataframe')
print(pd.DataFrame(data2, index=list('abcde'), columns=['one', 'two', 'three', 'four']))
print('---------1---------')
利用ndarrays创建dataframe
one two three four
a 4 1 3 2
b 5 2 4 3
c 6 3 5 4
d 7 4 6 5
e 8 5 7 6
---------1---------
data3=[{'a':1,'b':2},{'a':3,'b':4,'c':5}]
df=pd.DataFrame(data3)
print(df)
a b c
0 1 2 NaN
1 3 4 5.0
data4={
"calories":[100,200,300],
"duration":[10,20,30]
}
df=pd.DataFrame(data4)
print(df)
print('---------1---------')
#返回第一行
print(df.loc[0])
#返回第二行
print(df.loc[1])
#返回的对象类型
print(type(df.loc[1]))
calories duration
0 100 10
1 200 20
2 300 30
---------1---------
calories 100
duration 10
Name: 0, dtype: int64
calories 200
duration 20
Name: 1, dtype: int64
#返回第一行和第二行
print(df.loc[[0,1]])
calories duration
0 100 10
1 200 20
data5={
"calories":[100,200,300],
"duration":[10,20,30]
}
df=pd.DataFrame(data5,index=["day1","day2","day3"])
print(df)
calories duration
day1 100 10
day2 200 20
day3 300 30
print(df.loc["day2"])
calories 200
duration 20
Name: day2, dtype: int64
data5={
"calories":[100,200,300],
"duration":[10,20,30]
}
df=pd.DataFrame(data5,index=["day1","day2","day3"])
print(df)
print('---------1---------')
#获取列
name_column=df['calories']
print(name_column)
print('---------2---------')
#获取行
first_row=df.loc['day1']
print(first_row)
print('---------3---------')
#选择多列
subset=df[['calories','duration']]
print(subset)
print('---------4---------')
#过滤行
filter_rows=df[df['duration']>10]
print(filter_rows)
calories duration
day1 100 10
day2 200 20
day3 300 30
---------1---------
day1 100
day2 200
day3 300
Name: calories, dtype: int64
---------2---------
calories 100
duration 10
Name: day1, dtype: int64
---------3---------
calories duration
day1 100 10
day2 200 20
day3 300 30
---------4---------
calories duration
day2 200 20
day3 300 30
Pandas 获取相关的属性和方法:
data5={
"calories":[100,200,300],
"duration":[10,20,30]
}
df=pd.DataFrame(data5,index=["day1","day2","day3"])
print(df)
print('---------1---------')
# 获取列名
columns = df.columns
print(columns)
print('---------2---------')
# 获取形状(行数和列数)
shape = df.shape
print(shape)
print('---------3---------')
# 获取索引
index = df.index
print(index)
print('---------4---------')
# 获取描述统计信息
stats = df.describe()
print(stats)
print('---------5---------')
calories duration
day1 100 10
day2 200 20
day3 300 30
---------1---------
Index(['calories', 'duration'], dtype='object')
---------2---------
(3, 2)
---------3---------
Index(['day1', 'day2', 'day3'], dtype='object')
---------4---------
calories duration
count 3.0 3.0
mean 200.0 20.0
std 100.0 10.0
min 100.0 10.0
25% 150.0 15.0
50% 200.0 20.0
75% 250.0 25.0
max 300.0 30.0
---------5---------
Pandas相关的数据操作:
DataFrame中的drop函数用于删除指定行或列。它返回一个新的DataFrame,原始DataFrame保持不变。
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
.
参数说明:
- labels: 要删除的行或列的标签。
- axis: 指定删除的是行还是列,可以是0(行)或1(列)。
- index: 要删除的行的标签,与labels参数相同,只是提供了另一种指定行的方式。
- columns: 要删除的列的标签,与labels参数相同,只是提供了另一种指定列的方式。
- level: 当DataFrame具有多层索引时,指定删除的级别。
- inplace: 如果为True,则直接在原始DataFrame上进行修改,而不返回新的DataFrame。
- errors: 如果指定的标签不存在,确定是否引发错误。默认为’raise’,表示引发错误;可以设置为’ignore’,表示忽略。 、
DataFrame中的sort_values函数用于按照指定的列或多列的值对数据进行排序。它返回一个新的DataFrame,原始DataFrame保持不变。
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
参数说明:
- by: 指定用于排序的列或列的列表。
- axis: 排序的轴,可以是0(按行排序)或1(按列排序)。
- ascending: 排序顺序,为True表示升序,为False表示降序。
- inplace: 如果为True,则直接在原始DataFrame上进行排序,而不返回新的DataFrame。
- kind: 排序算法,可以是’quicksort’、‘mergesort’、‘heapsort’,默认是’quicksort’。
- na_position: 缺失值在排序时的位置,可以是’first’、‘last’,默认是’last’。
- ignore_index: 如果为True,则忽略排序后的索引,重新生成默认的整数索引。
- key: 用于排序的函数。
data6={
"Name":["gcc1","gcc2","gcc3"],
"Age":[20,30,40],
"City":["changsha","shanghai","guangzhou"]
}
df=pd.DataFrame(data6)
print(df)
print('---------1---------')
# 添加新列
df['Salary'] = [50000, 60000, 70000]
print(df)
print('---------2---------')
# 删除列
df.drop('City', axis=1, inplace=True)
print(df)
print('---------3---------')
# 排序
df.sort_values(by='Age', ascending=False, inplace=True)
print(df)
print('---------4---------')
# 重命名列
df.rename(columns={'Name': 'Full Name'}, inplace=True)
print(df)
Name Age City
0 gcc1 20 changsha
1 gcc2 30 shanghai
2 gcc3 40 guangzhou
---------1---------
Name Age City Salary
0 gcc1 20 changsha 50000
1 gcc2 30 shanghai 60000
2 gcc3 40 guangzhou 70000
---------2---------
Name Age Salary
0 gcc1 20 50000
1 gcc2 30 60000
2 gcc3 40 70000
---------3---------
Name Age Salary
2 gcc3 40 70000
1 gcc2 30 60000
0 gcc1 20 50000
---------4---------
Full Name Age Salary
2 gcc3 40 70000
1 gcc2 30 60000
0 gcc1 20 50000
从外部数据源创建 DataFrame:
# 从CSV文件创建 DataFrame
df_csv = pd.read_csv('example.csv')
print(df_csv)
print('---------1---------')
# 从Excel文件创建 DataFrame
df_excel = pd.read_excel('example2.xls')
print(df_excel)
print('---------2---------')
# 从字典列表创建 DataFrame
data_list = [{'Name': 'John', 'Age': 25,'City':'New York'}, {'Name': 'Jane', 'Age': 30,'City':'San Francisco'},{'Name': 'Bob', 'Age': 22,'City':'Chicago'}]
df_from_list = pd.DataFrame(data_list)
print(df_from_list)
print('---------3---------')
Name Age City
0 John 25 New York
1 Jane 30 San Francisco
2 Bob 22 Chicago
---------1---------
Name Age City
0 John 25 New York
1 Jane 30 San Francisco
2 Bob 22 Chicago
---------2---------
Name Age City
0 John 25 New York
1 Jane 30 San Francisco
2 Bob 22 Chicago
---------3---------
注意事项:
- DataFrame 是一种灵活的数据结构,可以容纳不同数据类型的列。
- 列名和行索引可以是字符串、整数等。
- DataFrame 可以通过多种方式进行数据选择、过滤、修改和分析。
- 通过对 DataFrame 的操作,可以进行数据清洗、转换、分析和可视化等工作。
to_string() 用于返回 DataFrame 类型的数据,如果不使用该函数,则输出结果为数据的前面 5 行和末尾 5 行,中间部分以 … 代替。
df=pd.read_csv('nba.csv')
print(df.to_string())
Name Team Number Position Age Height Weight College Salary
0 Avery Bradley Boston Celtics 0.0 PG 25.0 6-2 180.0 Texas 7730337.0
1 Jae Crowder Boston Celtics 99.0 SF 25.0 6-6 235.0 Marquette 6796117.0
2 John Holland Boston Celtics 30.0 SG 27.0 6-5 205.0 Boston University NaN
3 R.J. Hunter Boston Celtics 28.0 SG 22.0 6-5 185.0 Georgia State 1148640.0
4 Jonas Jerebko Boston Celtics 8.0 PF 29.0 6-10 231.0 NaN 5000000.0
5 Amir Johnson Boston Celtics 90.0 PF 29.0 6-9 240.0 NaN 12000000.0
6 Jordan Mickey Boston Celtics 55.0 PF 21.0 6-8 235.0 LSU 1170960.0
7 Kelly Olynyk Boston Celtics 41.0 C 25.0 7-0 238.0 Gonzaga 2165160.0
8 Terry Rozier Boston Celtics 12.0 PG 22.0 6-2 190.0 Louisville 1824360.0
9 Marcus Smart Boston Celtics 36.0 PG 22.0 6-4 220.0 Oklahoma State 3431040.0
10 Jared Sullinger Boston Celtics 7.0 C 24.0 6-9 260.0 Ohio State 2569260.0
11 Isaiah Thomas Boston Celtics 4.0 PG 27.0 5-9 185.0 Washington 6912869.0
12 Evan Turner Boston Celtics 11.0 SG 27.0 6-7 220.0 Ohio State 3425510.0
13 James Young Boston Celtics 13.0 SG 20.0 6-6 215.0 Kentucky 1749840.0
14 Tyler Zeller Boston Celtics 44.0 C 26.0 7-0 253.0 North Carolina 2616975.0
15 Bojan Bogdanovic Brooklyn Nets 44.0 SG 27.0 6-8 216.0 NaN 3425510.0
16 Markel Brown Brooklyn Nets 22.0 SG 24.0 6-3 190.0 Oklahoma State 845059.0
17 Wayne Ellington Brooklyn Nets 21.0 SG 28.0 6-4 200.0 North Carolina 1500000.0
18 Rondae Hollis-Jefferson Brooklyn Nets 24.0 SG 21.0 6-7 220.0 Arizona 1335480.0
19 Jarrett Jack Brooklyn Nets 2.0 PG 32.0 6-3 200.0 Georgia Tech 6300000.0
20 Sergey Karasev Brooklyn Nets 10.0 SG 22.0 6-7 208.0 NaN 1599840.0
21 Sean Kilpatrick Brooklyn Nets 6.0 SG 26.0 6-4 219.0 Cincinnati 134215.0
22 Shane Larkin Brooklyn Nets 0.0 PG 23.0 5-11 175.0 Miami (FL) 1500000.0
23 Brook Lopez Brooklyn Nets 11.0 C 28.0 7-0 275.0 Stanford 19689000.0
24 Chris McCullough Brooklyn Nets 1.0 PF 21.0 6-11 200.0 Syracuse 1140240.0
25 Willie Reed Brooklyn Nets 33.0 PF 26.0 6-10 220.0 Saint Louis 947276.0
26 Thomas Robinson Brooklyn Nets 41.0 PF 25.0 6-10 237.0 Kansas 981348.0
27 Henry Sims Brooklyn Nets 14.0 C 26.0 6-10 248.0 Georgetown 947276.0
28 Donald Sloan Brooklyn Nets 15.0 PG 28.0 6-3 205.0 Texas A&M 947276.0
29 Thaddeus Young Brooklyn Nets 30.0 PF 27.0 6-8 221.0 Georgia Tech 11235955.0
30 Arron Afflalo New York Knicks 4.0 SG 30.0 6-5 210.0 UCLA 8000000.0
31 Lou Amundson New York Knicks 17.0 PF 33.0 6-9 220.0 UNLV 1635476.0
32 Thanasis Antetokounmpo New York Knicks 43.0 SF 23.0 6-7 205.0 NaN 30888.0
33 Carmelo Anthony New York Knicks 7.0 SF 32.0 6-8 240.0 Syracuse 22875000.0
34 Jose Calderon New York Knicks 3.0 PG 34.0 6-3 200.0 NaN 7402812.0
35 Cleanthony Early New York Knicks 11.0 SF 25.0 6-8 210.0 Wichita State 845059.0
36 Langston Galloway New York Knicks 2.0 SG 24.0 6-2 200.0 Saint Joseph's 845059.0
37 Jerian Grant New York Knicks 13.0 PG 23.0 6-4 195.0 Notre Dame 1572360.0
38 Robin Lopez New York Knicks 8.0 C 28.0 7-0 255.0 Stanford 12650000.0
39 Kyle O'Quinn New York Knicks 9.0 PF 26.0 6-10 250.0 Norfolk State 3750000.0
40 Kristaps Porzingis New York Knicks 6.0 PF 20.0 7-3 240.0 NaN 4131720.0
41 Kevin Seraphin New York Knicks 1.0 C 26.0 6-10 278.0 NaN 2814000.0
42 Lance Thomas New York Knicks 42.0 SF 28.0 6-8 235.0 Duke 1636842.0
43 Sasha Vujacic New York Knicks 18.0 SG 32.0 6-7 195.0 NaN 947276.0
44 Derrick Williams New York Knicks 23.0 PF 25.0 6-8 240.0 Arizona 4000000.0
45 Tony Wroten New York Knicks 5.0 SG 23.0 6-6 205.0 Washington 167406.0
46 Elton Brand Philadelphia 76ers 42.0 PF 37.0 6-9 254.0 Duke NaN
47 Isaiah Canaan Philadelphia 76ers 0.0 PG 25.0 6-0 201.0 Murray State 947276.0
48 Robert Covington Philadelphia 76ers 33.0 SF 25.0 6-9 215.0 Tennessee State 1000000.0
49 Joel Embiid Philadelphia 76ers 21.0 C 22.0 7-0 250.0 Kansas 4626960.0
50 Jerami Grant Philadelphia 76ers 39.0 SF 22.0 6-8 210.0 Syracuse 845059.0
51 Richaun Holmes Philadelphia 76ers 22.0 PF 22.0 6-10 245.0 Bowling Green 1074169.0
52 Carl Landry Philadelphia 76ers 7.0 PF 32.0 6-9 248.0 Purdue 6500000.0
53 Kendall Marshall Philadelphia 76ers 5.0 PG 24.0 6-4 200.0 North Carolina 2144772.0
54 T.J. McConnell Philadelphia 76ers 12.0 PG 24.0 6-2 200.0 Arizona 525093.0
55 Nerlens Noel Philadelphia 76ers 4.0 PF 22.0 6-11 228.0 Kentucky 3457800.0
56 Jahlil Okafor Philadelphia 76ers 8.0 C 20.0 6-11 275.0 Duke 4582680.0
57 Ish Smith Philadelphia 76ers 1.0 PG 27.0 6-0 175.0 Wake Forest 947276.0
58 Nik Stauskas Philadelphia 76ers 11.0 SG 22.0 6-6 205.0 Michigan 2869440.0
59 Hollis Thompson Philadelphia 76ers 31.0 SG 25.0 6-8 206.0 Georgetown 947276.0
60 Christian Wood Philadelphia 76ers 35.0 PF 20.0 6-11 220.0 UNLV 525093.0
61 Bismack Biyombo Toronto Raptors 8.0 C 23.0 6-9 245.0 NaN 2814000.0
62 Bruno Caboclo Toronto Raptors 20.0 SF 20.0 6-9 205.0 NaN 1524000.0
63 DeMarre Carroll Toronto Raptors 5.0 SF 29.0 6-8 212.0 Missouri 13600000.0
64 DeMar DeRozan Toronto Raptors 10.0 SG 26.0 6-7 220.0 USC 10050000.0
65 James Johnson Toronto Raptors 3.0 PF 29.0 6-9 250.0 Wake Forest 2500000.0
66 Cory Joseph Toronto Raptors 6.0 PG 24.0 6-3 190.0 Texas
print(df)
Name Team Number Position Age Height Weight \
0 Avery Bradley Boston Celtics 0.0 PG 25.0 6-2 180.0
1 Jae Crowder Boston Celtics 99.0 SF 25.0 6-6 235.0
2 John Holland Boston Celtics 30.0 SG 27.0 6-5 205.0
3 R.J. Hunter Boston Celtics 28.0 SG 22.0 6-5 185.0
4 Jonas Jerebko Boston Celtics 8.0 PF 29.0 6-10 231.0
.. ... ... ... ... ... ... ...
453 Shelvin Mack Utah Jazz 8.0 PG 26.0 6-3 203.0
454 Raul Neto Utah Jazz 25.0 PG 24.0 6-1 179.0
455 Tibor Pleiss Utah Jazz 21.0 C 26.0 7-3 256.0
456 Jeff Withey Utah Jazz 24.0 C 26.0 7-0 231.0
457 NaN NaN NaN NaN NaN NaN NaN
College Salary
0 Texas 7730337.0
1 Marquette 6796117.0
2 Boston University NaN
3 Georgia State 1148640.0
4 NaN 5000000.0
.. ... ...
453 Butler 2433333.0
454 NaN 900000.0
455 NaN 2900000.0
456 Kansas 947276.0
457 NaN NaN
[458 rows x 9 columns]
nme=['Goole','taobao','baidu']
st=["www.goole.com","www.taobao.com","www.baidu.com"]
ag=[90,80,70]
dict={'name':nme,'site':st,'age':ag}
df=pd.DataFrame(dict)
df.to_csv('site.csv')
df=pd.read_csv('nba.csv')
print(df.head())
print('---------1---------')
#读取前面十行
print(df.head(10))
Name Team Number Position Age Height Weight \
0 Avery Bradley Boston Celtics 0.0 PG 25.0 6-2 180.0
1 Jae Crowder Boston Celtics 99.0 SF 25.0 6-6 235.0
2 John Holland Boston Celtics 30.0 SG 27.0 6-5 205.0
3 R.J. Hunter Boston Celtics 28.0 SG 22.0 6-5 185.0
4 Jonas Jerebko Boston Celtics 8.0 PF 29.0 6-10 231.0
College Salary
0 Texas 7730337.0
1 Marquette 6796117.0
2 Boston University NaN
3 Georgia State 1148640.0
4 NaN 5000000.0
---------1---------
Name Team Number Position Age Height Weight \
0 Avery Bradley Boston Celtics 0.0 PG 25.0 6-2 180.0
1 Jae Crowder Boston Celtics 99.0 SF 25.0 6-6 235.0
2 John Holland Boston Celtics 30.0 SG 27.0 6-5 205.0
3 R.J. Hunter Boston Celtics 28.0 SG 22.0 6-5 185.0
4 Jonas Jerebko Boston Celtics 8.0 PF 29.0 6-10 231.0
5 Amir Johnson Boston Celtics 90.0 PF 29.0 6-9 240.0
6 Jordan Mickey Boston Celtics 55.0 PF 21.0 6-8 235.0
7 Kelly Olynyk Boston Celtics 41.0 C 25.0 7-0 238.0
8 Terry Rozier Boston Celtics 12.0 PG 22.0 6-2 190.0
9 Marcus Smart Boston Celtics 36.0 PG 22.0 6-4 220.0
College Salary
0 Texas 7730337.0
1 Marquette 6796117.0
2 Boston University NaN
3 Georgia State 1148640.0
4 NaN 5000000.0
5 NaN 12000000.0
6 LSU 1170960.0
7 Gonzaga 2165160.0
8 Louisville 1824360.0
9 Oklahoma State 3431040.0
df = pd.read_csv('nba.csv')
print(df.tail())
print('---------1---------')
print(df.tail(10))
Name Team Number Position Age Height Weight College \
453 Shelvin Mack Utah Jazz 8.0 PG 26.0 6-3 203.0 Butler
454 Raul Neto Utah Jazz 25.0 PG 24.0 6-1 179.0 NaN
455 Tibor Pleiss Utah Jazz 21.0 C 26.0 7-3 256.0 NaN
456 Jeff Withey Utah Jazz 24.0 C 26.0 7-0 231.0 Kansas
457 NaN NaN NaN NaN NaN NaN NaN NaN
Salary
453 2433333.0
454 900000.0
455 2900000.0
456 947276.0
457 NaN
---------1---------
Name Team Number Position Age Height Weight \
448 Gordon Hayward Utah Jazz 20.0 SF 26.0 6-8 226.0
449 Rodney Hood Utah Jazz 5.0 SG 23.0 6-8 206.0
450 Joe Ingles Utah Jazz 2.0 SF 28.0 6-8 226.0
451 Chris Johnson Utah Jazz 23.0 SF 26.0 6-6 206.0
452 Trey Lyles Utah Jazz 41.0 PF 20.0 6-10 234.0
453 Shelvin Mack Utah Jazz 8.0 PG 26.0 6-3 203.0
454 Raul Neto Utah Jazz 25.0 PG 24.0 6-1 179.0
455 Tibor Pleiss Utah Jazz 21.0 C 26.0 7-3 256.0
456 Jeff Withey Utah Jazz 24.0 C 26.0 7-0 231.0
457 NaN NaN NaN NaN NaN NaN NaN
College Salary
448 Butler 15409570.0
449 Duke 1348440.0
450 NaN 2050000.0
451 Dayton 981348.0
452 Kentucky 2239800.0
453 Butler 2433333.0
454 NaN 900000.0
455 NaN 2900000.0
456 Kansas 947276.0
457 NaN NaN
df = pd.read_csv('nba.csv')
print(df.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 458 entries, 0 to 457 # 行数,458 行,第一行编号为 0
Data columns (total 9 columns) # 列数,9列
# Column Non-Null Count Dtype # 各列的数据类型
--- ------ -------------- -----
0 Name 457 non-null object
1 Team 457 non-null object
2 Number 457 non-null float64
3 Position 457 non-null object
4 Age 457 non-null float64
5 Height 457 non-null object
6 Weight 457 non-null float64
7 College 373 non-null object
8 Salary 446 non-null float64 # non-null,意思为非空的数据
dtypes: float64(4), object(5) # 类型
memory usage: 32.3+ KB
None
non-null 为非空数据,我们可以看到上面的信息中,总共 458 行,College 字段的空值最多。
df=pd.read_json('sites.json')
print(df.to_string())
id name url likes
0 A001 菜鸟教程 www.runoob.com 61
1 A002 Google www.google.com 124
2 A003 淘宝 www.taobao.com 45
data =[
{
"id": "A001",
"name": "菜鸟教程",
"url": "www.runoob.com",
"likes": 61
},
{
"id": "A002",
"name": "Google",
"url": "www.google.com",
"likes": 124
},
{
"id": "A003",
"name": "淘宝",
"url": "www.taobao.com",
"likes": 45
}
]
df = pd.DataFrame(data)
print(df)
id name url likes
0 A001 菜鸟教程 www.runoob.com 61
1 A002 Google www.google.com 124
2 A003 淘宝 www.taobao.com 45
s={
"id":{"row1":"A001","row2":"A002","row3":"A003"},
"name":{"row1":"菜鸟教程","row2":"Google","row3":"淘宝"},
"url":{"row1":"www.runoob.com","row2":"www.google.com","row3":"www.taobao.com"},
"likes":{"row1":61,"row2":124,"row3":45},
}
df=pd.DataFrame(s)
print(df)
id name url likes
row1 A001 菜鸟教程 www.runoob.com 61
row2 A002 Google www.google.com 124
row3 A003 淘宝 www.taobao.com 45
内嵌的 JSON 数据
假设有一组内嵌的 JSON 数据文件 nested_list.json :
{
"school_name": "ABC primary school",
"class": "Year 1",
"students": [
{
"id": "A001",
"name": "Tom",
"math": 60,
"physics": 66,
"chemistry": 61
},
{
"id": "A002",
"name": "James",
"math": 89,
"physics": 76,
"chemistry": 51
},
{
"id": "A003",
"name": "Jenny",
"math": 79,
"physics": 90,
"chemistry": 78
}]
}
import pandas as pd
df = pd.read_json('nested_list.json')
print(df)
school_name class \
0 ABC primary school Year 1
1 ABC primary school Year 1
2 ABC primary school Year 1
students
0 {'id': 'A001', 'name': 'Tom', 'math': 60, 'phy...
1 {'id': 'A002', 'name': 'James', 'math': 89, 'p...
2 {'id': 'A003', 'name': 'Jenny', 'math': 79, 'p...
可以看到输出的结果中Students没有被完全展开,这时候需要使用json_normalize()将内嵌的JSON展开。
pandas.json_normalize() 函数用于将嵌套的 JSON 数据规范化成扁平的表格形式(表格化)。
这是在处理具有嵌套结构的 JSON 数据时非常有用的功能,因为它允许将 JSON 数据展平到 Pandas DataFrame 中,便于进一步处理和分析。
以下是 json_normalize() 函数的基本语法:
pandas.json_normalize(data, record_path=None, meta=None, sep='_', max_level=None, errors='raise')
参数说明:
data: 包含 JSON 数据的字典或列表。
record_path: 用于提取嵌套记录的路径,指定要规范化的嵌套结构的位置。
meta: 需要包含在结果 DataFrame 中的元数据(非规范化的字段)。
sep: 用于连接嵌套路径的分隔符。
max_level: 指定规范化的最大层级深度。
errors: 如果遇到错误,确定是否引发异常。默认是 ‘raise’。
import json
with open('nested_list.json','r') as f:
data=json.load(f)
#展开数据
df_nested_list=pd.json_normalize(data,record_path=['students'])
print(df_nested_list)
id name math physics chemistry
0 A001 Tom 60 66 61
1 A002 James 89 76 51
2 A003 Jenny 79 90 78
data = json.load(f) 使用 Python JSON 模块载入数据。
json_normalize() 使用了参数 record_path 并设置为 [‘students’] 用于展开内嵌的 JSON 数据 students。
# 使用 Python JSON 模块载入数据
with open('nested_list.json','r') as f:
data = json.load(f)
# 展平数据
df_nested_list = pd.json_normalize(
data,
record_path =['students'],
meta=['school_name', 'class']
)
print(df_nested_list)
id name math physics chemistry school_name class
0 A001 Tom 60 66 61 ABC primary school Year 1
1 A002 James 89 76 51 ABC primary school Year 1
2 A003 Jenny 79 90 78 ABC primary school Year 1
尝试读取更复杂的 JSON 数据,该数据嵌套了列表和字典,数据文件 nested_mix.json 如下:
* {
"school_name": "local primary school",
"class": "Year 1",
"info": {
"president": "John Kasich",
"address": "ABC road, London, UK",
"contacts": {
"email": "[email protected]",
"tel": "123456789"
}
},
"students": [
{
"id": "A001",
"name": "Tom",
"math": 60,
"physics": 66,
"chemistry": 61
},
{
"id": "A002",
"name": "James",
"math": 89,
"physics": 76,
"chemistry": 51
},
{
"id": "A003",
"name": "Jenny",
"math": 79,
"physics": 90,
"chemistry": 78
}]
}
nested_mix.json 文件转换为 DataFrame:
# 使用 Python JSON 模块载入数据
with open('nested_mix.json','r') as f:
data = json.load(f)
df = pd.json_normalize(
data,
record_path =['students'],
meta=[
'class',
['info', 'president'],
['info', 'address'],
['info', 'contacts', 'tel'],
['info', 'contacts', 'email'],
]
)
print(df)
id name math physics chemistry class info.president \
0 A001 Tom 60 66 61 Year 1 John Kasich
1 A002 James 89 76 51 Year 1 John Kasich
2 A003 Jenny 79 90 78 Year 1 John Kasich
info.address info.contacts.tel info.contacts.email
0 ABC road, London, UK 123456789 [email protected]
1 ABC road, London, UK 123456789 [email protected]
2 ABC road, London, UK 123456789 [email protected]
以下是实例文件 nested_deep.json,我们只读取内嵌中的 math 字段:
* {
"school_name": "local primary school",
"class": "Year 1",
"students": [
{
"id": "A001",
"name": "Tom",
"grade": {
"math": 60,
"physics": 66,
"chemistry": 61
}
},
{
"id": "A002",
"name": "James",
"grade": {
"math": 89,
"physics": 76,
"chemistry": 51
}
},
{
"id": "A003",
"name": "Jenny",
"grade": {
"math": 79,
"physics": 90,
"chemistry": 78
}
}]
}
这里我们需要使用到 glom 模块来处理数据套嵌,glom 模块允许我们使用 . 来访问内嵌对象的属性
pip install glom
Collecting glom
Downloading glom-23.5.0-py3-none-any.whl (102 kB)
[2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m102.7/102.7 kB[0m [31m352.2 kB/s[0m eta [36m0:00:00[0ma [36m0:00:01[0m
[?25hRequirement already satisfied: attrs in /Users/gcc/opt/anaconda3/lib/python3.9/site-packages (from glom) (21.4.0)
Collecting face==20.1.1
Downloading face-20.1.1-py3-none-any.whl (51 kB)
[2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m51.1/51.1 kB[0m [31m1.2 MB/s[0m eta [36m0:00:00[0ma [36m0:00:01[0m
[?25hRequirement already satisfied: boltons>=19.3.0 in /Users/gcc/opt/anaconda3/lib/python3.9/site-packages (from glom) (23.0.0)
Installing collected packages: face, glom
Successfully installed face-20.1.1 glom-23.5.0
Note: you may need to restart the kernel to use updated packages.
df[‘students’].apply(lambda row: glom(row, ‘grade.math’)):对 DataFrame 中的 ‘students’ 列执行操作。
对于 ‘students’ 列中的每一行,使用 glom 函数提取嵌套的 ‘grade.math’ 数据。
这一步中,使用了 apply 方法,对于 ‘students’ 列中的每一行,将其作为参数传递给 lambda 函数,该函数使用 glom 提取 ‘grade.math’。
from glom import glom
df=pd.read_json('nested_deep.json')
data=df['students'].apply(lambda row: glom(row,'grade.math'))
print(data)
0 60
1 89
2 79
Name: students, dtype: int64
数据清洗是对一些没有用的数据进行处理的过程。
很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。
在这个教程中,我们将利用 Pandas包来进行数据清洗。
本文使用到的测试数据 property-data.csv 下载地址:https://static.runoob.com/download/property-data.csv,如下所示:
表包含了四种空数据:
空值 |
---|
n/a |
NA |
– |
na |
- 如果我们要删除包含空字段的行,可以使用 dropna() 方法,语法格式如下:
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数说明:
axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
how:默认为 ‘any’ 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how=‘all’ 一行(或列)都是 NA 才去掉这整行。
thresh:设置需要多少非空值的数据才可以保留下来的。
subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。
df=pd.read_csv('property-data.csv')
print(df)
print('-------1------')
print(df['NUM_BEDROOMS'].isnull())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
2 100003000.0 NaN LEXINGTON N NaN 1 850
3 100004000.0 201.0 BERKELEY 12 1 NaN 700
4 NaN 203.0 BERKELEY Y 3 2 1600
5 100006000.0 207.0 BERKELEY Y NaN 1 800
6 100007000.0 NaN WASHINGTON NaN 2 HURLEY 950
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800
-------1------
0 False
1 False
2 True
3 False
4 False
5 True
6 False
7 False
8 False
Name: NUM_BEDROOMS, dtype: bool
missing_values=["n/a","na","--"]
df=pd.read_csv('property-data.csv',na_values=missing_values)
print(df['NUM_BEDROOMS'])
print('-------1------')
print(df['NUM_BEDROOMS'].isnull())
0 3.0
1 3.0
2 NaN
3 1.0
4 3.0
5 NaN
6 2.0
7 1.0
8 NaN
Name: NUM_BEDROOMS, dtype: float64
-------1------
0 False
1 False
2 True
3 False
4 False
5 True
6 False
7 False
8 True
Name: NUM_BEDROOMS, dtype: bool
#如果不指定空数据类型
df = pd.read_csv('property-data.csv')
new_df = df.dropna()
print(new_df.to_string())
print('-------1------')
#如果指定空数据类型
missing_values=["n/a","na","--"]
df=pd.read_csv('property-data.csv',na_values=missing_values)
new_df=df.dropna()
print(new_df.to_string())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
8 100009000.0 215.0 TREMONT Y na 2 1800
-------1------
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3.0 1 1000.0
df = pd.read_csv('property-data.csv')
df.dropna(inplace = True)
print(df.to_string())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
8 100009000.0 215.0 TREMONT Y na 2 1800
df = pd.read_csv('property-data.csv')
print(df.to_string())
print('-------1------')
df.dropna(subset=['ST_NUM'], inplace = True)
print(df.to_string())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
2 100003000.0 NaN LEXINGTON N NaN 1 850
3 100004000.0 201.0 BERKELEY 12 1 NaN 700
4 NaN 203.0 BERKELEY Y 3 2 1600
5 100006000.0 207.0 BERKELEY Y NaN 1 800
6 100007000.0 NaN WASHINGTON NaN 2 HURLEY 950
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800
-------1------
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
3 100004000.0 201.0 BERKELEY 12 1 NaN 700
4 NaN 203.0 BERKELEY Y 3 2 1600
5 100006000.0 207.0 BERKELEY Y NaN 1 800
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800
fillna() 方法可以替换一些空字段:
- pandas 的 fillna 函数用于替换 DataFrame 或 Series 中的缺失值(NaN)。缺失值是在数据中表示缺失或未知值的标记。
以下是 fillna 函数的基本语法:
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
主要参数:
value: 用于替换缺失值的标量值、字典、Series 或 DataFrame。
method: 用于指定填充缺失值的方法,例如 ‘ffill’(前向填充)或 ‘bfill’(后向填充)。
axis: 指定在哪个方向上填充,可以是 0(按列填充)或 1(按行填充)。
inplace: 如果为 True,则在原始对象上进行操作,不返回新的对象。
limit: 控制填充的次数,例如,如果设置为 1,则每列或每行中的第一个缺失值将被替换。
downcast: 指定数据类型转换,例如 ‘integer’、‘signed’、‘unsigned’、‘float’ 等。
df = pd.read_csv('property-data.csv')
print(df.to_string())
print('-------1------')
df.fillna(10000000, inplace = True)
print(df.to_string())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
2 100003000.0 NaN LEXINGTON N NaN 1 850
3 100004000.0 201.0 BERKELEY 12 1 NaN 700
4 NaN 203.0 BERKELEY Y 3 2 1600
5 100006000.0 207.0 BERKELEY Y NaN 1 800
6 100007000.0 NaN WASHINGTON NaN 2 HURLEY 950
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800
-------1------
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
2 100003000.0 10000000.0 LEXINGTON N 10000000 1 850
3 100004000.0 201.0 BERKELEY 12 1 10000000 700
4 10000000.0 203.0 BERKELEY Y 3 2 1600
5 100006000.0 207.0 BERKELEY Y 10000000 1 800
6 100007000.0 10000000.0 WASHINGTON 10000000 2 HURLEY 950
7 100008000.0 213.0 TREMONT Y 1 1 10000000
8 100009000.0 215.0 TREMONT Y na 2 1800
import pandas as pd
df = pd.read_csv('property-data.csv')
print(df.to_string())
print('-------1------')
df['PID'].fillna(2e9, inplace = True)
print(df.to_string())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
2 100003000.0 NaN LEXINGTON N NaN 1 850
3 100004000.0 201.0 BERKELEY 12 1 NaN 700
4 NaN 203.0 BERKELEY Y 3 2 1600
5 100006000.0 207.0 BERKELEY Y NaN 1 800
6 100007000.0 NaN WASHINGTON NaN 2 HURLEY 950
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800
-------1------
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 1.000010e+08 104.0 PUTNAM Y 3 1 1000
1 1.000020e+08 197.0 LEXINGTON N 3 1.5 --
2 1.000030e+08 NaN LEXINGTON N NaN 1 850
3 1.000040e+08 201.0 BERKELEY 12 1 NaN 700
4 2.000000e+09 203.0 BERKELEY Y 3 2 1600
5 1.000060e+08 207.0 BERKELEY Y NaN 1 800
6 1.000070e+08 NaN WASHINGTON NaN 2 HURLEY 950
7 1.000080e+08 213.0 TREMONT Y 1 1 NaN
8 1.000090e+08 215.0 TREMONT Y na 2 1800
替换空单元格的常用方法是计算列的均值、中位数值或众数。
Pandas使用 mean()、median() 和 mode() 方法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最高的数)。
mean() 函数
mean() 函数用于计算均值,即数据的平均值。对于 DataFrame,它默认按列计算均值,也可以通过指定 axis 参数来按行计算。
也可以计算某一列的均值。median() 函数
median() 函数用于计算中位数,即数据的中间值。对于 DataFrame,它默认按列计算中位数,也可以通过指定 axis 参数来按行计算。
也可以计算某一列的中位数。mode() 函数
mode() 函数用于计算众数,即数据中出现频率最高的值。对于 DataFrame,它默认按列计算众数,也可以通过指定 axis 参数来按行计算。
也可以计算某一列的众数。
这些函数提供了对数据分布中心趋势的不同度量。在数据分析中,通常会使用这些函数来了解数据的集中趋势,并更好地理解数据的分布。
使用 mean() 方法计算列的均值并替换空单元格:
注意:在 Pandas 中,计算列的均值时,如果某个元素是 NaN(缺失值),mean() 函数会自动忽略 NaN,并计算非缺失值的均值。
如果希望在计算均值时将 NaN 视为零,可以使用 fillna 函数将 NaN 替换为零,然后再计算均值:
import pandas as pd
df = pd.read_csv('property-data.csv')
print(df.to_string())
print('-------1------')
x = df["ST_NUM"].mean()
print("means:",x)
df["ST_NUM"].fillna(x, inplace = True)
print(df.to_string())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
2 100003000.0 NaN LEXINGTON N NaN 1 850
3 100004000.0 201.0 BERKELEY 12 1 NaN 700
4 NaN 203.0 BERKELEY Y 3 2 1600
5 100006000.0 207.0 BERKELEY Y NaN 1 800
6 100007000.0 NaN WASHINGTON NaN 2 HURLEY 950
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800
-------1------
means: 191.42857142857142
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.000000 PUTNAM Y 3 1 1000
1 100002000.0 197.000000 LEXINGTON N 3 1.5 --
2 100003000.0 191.428571 LEXINGTON N NaN 1 850
3 100004000.0 201.000000 BERKELEY 12 1 NaN 700
4 NaN 203.000000 BERKELEY Y 3 2 1600
5 100006000.0 207.000000 BERKELEY Y NaN 1 800
6 100007000.0 191.428571 WASHINGTON NaN 2 HURLEY 950
7 100008000.0 213.000000 TREMONT Y 1 1 NaN
8 100009000.0 215.000000 TREMONT Y na 2 1800
df = pd.read_csv('property-data.csv')
print(df.to_string())
print('-------1------')
x = df["ST_NUM"].median()
print("median:",x)
df["ST_NUM"].fillna(x, inplace = True)
print(df.to_string())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
2 100003000.0 NaN LEXINGTON N NaN 1 850
3 100004000.0 201.0 BERKELEY 12 1 NaN 700
4 NaN 203.0 BERKELEY Y 3 2 1600
5 100006000.0 207.0 BERKELEY Y NaN 1 800
6 100007000.0 NaN WASHINGTON NaN 2 HURLEY 950
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800
-------1------
median: 203.0
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
2 100003000.0 203.0 LEXINGTON N NaN 1 850
3 100004000.0 201.0 BERKELEY 12 1 NaN 700
4 NaN 203.0 BERKELEY Y 3 2 1600
5 100006000.0 207.0 BERKELEY Y NaN 1 800
6 100007000.0 203.0 WASHINGTON NaN 2 HURLEY 950
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800
df = pd.read_csv('property-data.csv')
print(df.to_string())
print('-------1------')
x = df["ST_NUM"].mode()
print("mode:",x)
print('-------2------')
df["ST_NUM"].fillna(x, inplace = True)
print(df.to_string())
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
2 100003000.0 NaN LEXINGTON N NaN 1 850
3 100004000.0 201.0 BERKELEY 12 1 NaN 700
4 NaN 203.0 BERKELEY Y 3 2 1600
5 100006000.0 207.0 BERKELEY Y NaN 1 800
6 100007000.0 NaN WASHINGTON NaN 2 HURLEY 950
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800
-------1------
mode: 0 104.0
1 197.0
2 201.0
3 203.0
4 207.0
5 213.0
6 215.0
Name: ST_NUM, dtype: float64
-------2------
PID ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
0 100001000.0 104.0 PUTNAM Y 3 1 1000
1 100002000.0 197.0 LEXINGTON N 3 1.5 --
2 100003000.0 201.0 LEXINGTON N NaN 1 850
3 100004000.0 201.0 BERKELEY 12 1 NaN 700
4 NaN 203.0 BERKELEY Y 3 2 1600
5 100006000.0 207.0 BERKELEY Y NaN 1 800
6 100007000.0 215.0 WASHINGTON NaN 2 HURLEY 950
7 100008000.0 213.0 TREMONT Y 1 1 NaN
8 100009000.0 215.0 TREMONT Y na 2 1800
数据格式错误的单元格会使数据分析变得困难,甚至不可能。
我们可以通过包含空单元格的行,或者将列中的所有单元格转换为相同格式的数据。
以下实例会格式化日期:
import pandas as pd
# 第三个日期格式错误
data = {
"Date": ['2020/12/01', '2020/12/02' , '20201226'],
"duration": [50, 40, 45]
}
df = pd.DataFrame(data, index = ["day1", "day2", "day3"])
print(df.to_string())
print('-------1------')
df['Date'] = pd.to_datetime(df['Date'])
print(df.to_string())
Date duration
day1 2020/12/01 50
day2 2020/12/02 40
day3 20201226 45
-------1------
Date duration
day1 2020-12-01 50
day2 2020-12-02 40
day3 2020-12-26 45
数据错误也是很常见的情况,我们可以对错误的数据进行替换或移除。
以下实例会替换错误年龄的数据:
import pandas as pd
person = {
"name": ['gcc1', 'gcc2' , 'gcc3'],
"age": [50, 40, 12345] # 12345 年龄数据是错误的
}
df = pd.DataFrame(person)
df.loc[2, 'age'] = 30 # 修改数据
print(df.to_string())
name age
0 gcc1 50
1 gcc2 40
2 gcc3 30
也可以设置条件语句,筛选错误年龄的行:
将 age 大于 120 的设置为 120
person = {
"name": ['gcc1', 'gcc2' , 'gcc3'],
"age": [50, 40, 12345] # 12345 年龄数据是错误的
}
df = pd.DataFrame(person)
for x in df.index:
if df.loc[x,"age"]>120:
df.loc[x,"age"]=120
print(df.to_string())
name age
0 gcc1 50
1 gcc2 40
2 gcc3 120
也可以将错误数据的行删除: 将 age 大于 120 的删除;
pandas 中的 drop 函数用于删除指定轴上的指定标签或索引。具体来说,它可以用于删除行或列,取决于 axis 参数的设置。
以下是 drop 函数的基本语法:
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
主要参数:
labels: 要删除的行或列的标签。
axis: 删除的方向,可以是 0(行)或 1(列)。
index: 用于删除行的标签,与 labels 参数相同。
columns: 用于删除列的标签,与 labels 参数相同。
level: 在多层索引时,指定删除的级别。
inplace: 如果为 True,则在原始对象上进行操作,不返回新的对象。
errors: 如果指定的标签不存在,确定是否引发错误,默认是 ‘raise’,表示引发错误;可以设置为 ‘ignore’,表示忽略。
person = {
"name": ['gcc1', 'gcc2' , 'gcc3'],
"age": [50, 40, 12345] # 12345 年龄数据是错误的
}
df = pd.DataFrame(person)
for x in df.index:
if df.loc[x,"age"]>120:
df.drop(x,inplace=True)
print(df.to_string())
name age
0 gcc1 50
1 gcc2 40
duplicated() 函数
duplicated() 函数用于标记 DataFrame 或 Series 中的重复值。它返回一个布尔值的 Series,其中标记了是否重复。默认情况下,第一次出现的值不被视为重复,而后续的相同值被标记为重复。
参数说明
subset: 指定要检查重复值的列,可以是单个列名或多个列名的列表。默认是 None,表示检查整个行。
keep: 控制重复值的标记方式,有三个选项:
‘first’(默认): 保留第一次出现的值,后续相同值标记为重复。
‘last’: 保留最后一次出现的值,先前相同值标记为重复。
‘False’: 所有相同值都标记为重复。drop_duplicates() 函数
drop_duplicates() 函数用于删除 DataFrame 或 Series 中的重复值。默认情况下,保留第一次出现的值,删除后续的相同值。
参数说明
subset: 同样用于指定要检查重复值的列。
keep: 同样用于控制重复值的保留方式。
inplace: 如果为 True,则在原始对象上进行操作,不返回新的对象。
ignore_index: 如果为 True,则在删除重复值后重新索引。也可以通过传递参数来定制这两个函数的行为,例如,指定列名以检查重复值、保留最后一次出现的值等。这两个函数提供了对重复值的检测和删除的灵活性
如果对应的数据是重复的,duplicated() 会返回 True,否则返回 False。
person = {
"name": ['gcc', 'gcc1', 'gcc1', 'gcc2'],
"age": [23, 40, 40, 23]
}
df = pd.DataFrame(person)
print(df.duplicated())
0 False
1 False
2 True
3 False
dtype: bool
person = {
"name": ['gcc', 'gcc1', 'gcc1', 'gcc2'],
"age": [23, 40, 40, 23]
}
df = pd.DataFrame(person)
df.drop_duplicates(inplace=True)
print(df)
name age
0 gcc 23
1 gcc1 40
3 gcc2 23
函数 | 功能 |
---|---|
pd.read_csv(filename) | 读取 CSV 文件 |
pd.read_excel(filename) | 读取 Excel 文件 |
pd.read_sql(query, connection_object) | 从 SQL 数据库读取数据 |
pd.read_json(json_string) | 从 JSON 字符串中读取数据 |
pd.read_html(url) | 从 HTML 页面中读取数据 |
pip install html5lib
Collecting html5lib
Downloading html5lib-1.1-py2.py3-none-any.whl (112 kB)
[2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m112.2/112.2 kB[0m [31m258.7 kB/s[0m eta [36m0:00:00[0ma [36m0:00:01[0m
[?25hRequirement already satisfied: six>=1.9 in /Users/gcc/opt/anaconda3/lib/python3.9/site-packages (from html5lib) (1.16.0)
Requirement already satisfied: webencodings in /Users/gcc/opt/anaconda3/lib/python3.9/site-packages (from html5lib) (0.5.1)
Installing collected packages: html5lib
Successfully installed html5lib-1.1
Note: you may need to restart the kernel to use updated packages.
# 从 CSV 文件中读取数据
df = pd.read_csv('example.csv')
print(df.to_string())
print('--------1--------')
# 从 Excel 文件中读取数据
df = pd.read_excel('example2.xls')
print(df.to_string())
print('--------2--------')
# # 从 SQL 数据库中读取数据
# import sqlite3
# conn = sqlite3.connect('database.db')
# df = pd.read_sql('SELECT * FROM table_name', conn)
# 从 JSON 字符串中读取数据
df = pd.read_json('sites.json')
print(df.to_string())
print('--------3--------')
# 从 HTML 页面中读取数据
from bs4 import BeautifulSoup
import requests
url = 'https://www.baidu.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 找到包含表格的部分,可能需要根据实际情况修改选择器
table_soup = soup.find('table')
# 使用 pd.read_html 解析表格
# 如果在使用 pd.read_html(url) 时遇到 "No tables found" 错误,可能是因为页面上没有HTML表格或pandas无法正确解析页面的HTML结构。
# pd.read_html 函数的工作原理是查找HTML页面中的表格标签