Python数据分析之从零学Pandas基础操作
Pandas是一个在Python编程语言中广泛使用的开源数据分析和数据处理库。它提供了高效、灵活和易于使用的数据结构,特别适用于处理结构化和标签化数据。Pandas的主要数据结构是DataFrame和Series。DataFrame是一个类似于电子表格或SQL表的二维数据结构,可以存储和处理具有不同数据类型的列。Series是一维标签化数组,类似于一列数据。使用这些数据结构,Pandas提供了许多
文章目录
什么是Pandas
Pandas是一个在Python编程语言中广泛使用的开源数据分析和数据处理库。它提供了高效、灵活和易于使用的数据结构,特别适用于处理结构化和标签化数据。
Pandas的主要数据结构是DataFrame和Series。DataFrame是一个类似于电子表格或SQL表的二维数据结构,可以存储和处理具有不同数据类型的列。Series是一维标签化数组,类似于一列数据。使用这些数据结构,Pandas提供了许多功能强大的方法和函数,用于数据清洗、数据转换、数据筛选、数据分组、数据合并等数据操作任务。
Pandas具有许多功能,包括:
- 数据清洗和处理:Pandas提供了各种方法来处理缺失数据、重复数据、异常值等。它还提供了强大的数据转换功能,例如数据重塑、列添加和删除、数据排序等。
- 数据筛选和索引:Pandas允许根据条件从数据集中筛选数据,执行布尔索引和位置索引。这使得对数据进行子集选择和过滤变得非常方便。
- 数据分组和聚合:Pandas可以根据一列或多列的值对数据进行分组,并对分组后的数据执行聚合操作,如求和、平均值、最大值、最小值等。
- 数据合并和连接:Pandas提供了丰富的函数和方法来合并和连接不同数据集,包括数据库风格的合并(merge)操作、连接(join)操作以及拼接(concatenate)操作。
- 时间序列数据处理:Pandas对处理时间序列数据具有很好的支持,可以轻松处理日期和时间数据,执行重采样、频率转换、时区处理等操作。
- 数据可视化:Pandas结合了Matplotlib库,可以方便地进行数据可视化,绘制各种类型的图表,如折线图、柱状图、散点图等。
认识Series
Series是Pandas库中的一种数据结构,它表示带有标签的一维数组。可以将Series看作是由两个部分组成:索引(index)和值(value)。索引是标识数据的标签,值是实际存储的数据。
Series对象可以存储不同数据类型的数据,包括整数、浮点数、字符串等。它类似于NumPy中的一维数组,但与NumPy数组不同的是,Series可以使用自定义的索引来标识和访问数据。
下面是一个创建Series对象的示例:
import pandas as pd
# 创建一个Series对象
s = pd.Series([3, 5, 1, 8, 2])
print(s)
输出结果为:
0 3
1 5
2 1
3 8
4 2
dtype: int64
在上面的例子中,我们传递了一个包含整数的Python列表来创建Series对象。默认情况下,Pandas会自动为Series对象生成整数索引(从0开始)。在输出结果中,左侧的数字表示索引,右侧的数字表示对应的值。
可以通过自定义索引来创建Series对象,如下所示:
import pandas as pd
# 创建一个带有自定义索引的Series对象
s = pd.Series([3, 5, 1, 8, 2], index=['a', 'b', 'c', 'd', 'e'])
print(s)
输出结果为:
a 3
b 5
c 1
d 8
e 2
dtype: int64
在这个例子中,我们通过传递一个字符串列表作为索引参数来创建Series对象。每个值都与相应的索引标签相关联。
通过使用自定义索引,Series对象可以像字典一样使用。可以通过索引标签访问和操作Series中的元素。此外,Series对象还支持许多内置方法和函数,用于数据的统计、筛选、排序等操作。
总结来说,Series是Pandas中的一维标签化数组,可以存储不同类型的数据。它提供了一种灵活而方便的方式来处理一维数据,并具有丰富的功能和方法。
Series如何增加元素
要向Pandas的Series对象中添加元素,可以使用索引标签进行赋值操作或使用Pandas提供的方法来追加新的元素。
下面是两种常见的向Series对象中添加元素的方法:
- 通过索引标签赋值: 可以使用索引标签来添加新元素并为其赋值。如果指定的索引标签不存在,Pandas会自动创建新的索引并添加元素。
import pandas as pd
# 创建一个空的Series对象
s = pd.Series()
# 添加新元素并赋值
s['a'] = 3
s['b'] = 5
s['c'] = 1
print(s)
输出结果为:
a 3
b 5
c 1
dtype: int64
在上面的例子中,我们首先创建了一个空的Series对象,然后使用索引标签['a']
、['b']
和['c']
分别为其添加了新元素,并为每个元素赋予了相应的值。
- 使用Pandas提供的方法追加元素: Pandas提供了
append()
方法,可以用于将另一个Series对象追加到当前的Series对象末尾,从而增加元素。
import pandas as pd
# 创建一个Series对象
s1 = pd.Series([3, 5, 1])
s2 = pd.Series([8, 2])
# 使用append()方法追加元素
s = s1.append(s2)
print(s)
输出结果为:
0 3
1 5
2 1
0 8
1 2
dtype: int64
在这个例子中,我们首先创建了两个Series对象s1
和s2
,然后使用s1.append(s2)
将s2
追加到s1
的末尾,形成一个新的Series对象s
。
需要注意的是,通过追加方法创建的新Series对象会重新索引,以确保每个元素都有唯一的索引值。
Series如何删除元素
要从Pandas的Series对象中删除元素,可以使用drop()
方法或使用Python的del
语句来删除指定的索引标签。
下面是两种常见的从Series对象中删除元素的方法:
- 使用
drop()
方法删除指定索引的元素:drop()
方法可以删除指定索引的元素,并返回一个新的Series对象,不影响原始Series对象。
import pandas as pd
# 创建一个Series对象
s = pd.Series([3, 5, 1, 8, 2], index=['a', 'b', 'c', 'd', 'e'])
# 使用drop()方法删除指定索引的元素
s_new = s.drop('c')
print(s_new)
输出结果为:
a 3
b 5
d 8
e 2
dtype: int64
在上面的例子中,我们创建了一个Series对象s
,然后使用drop('c')
删除了索引为'c'
的元素,并将结果保存到s_new
中。
需要注意的是,drop()
方法并不会改变原始的Series对象s
,而是返回一个删除指定索引后的新Series对象s_new
。
- 使用
del
语句删除指定索引的元素:del
语句是Python的内置语法,可以用来删除变量或对象。对于Series对象,可以使用del
语句删除指定的索引标签。
import pandas as pd
# 创建一个Series对象
s = pd.Series([3, 5, 1, 8, 2], index=['a', 'b', 'c', 'd', 'e'])
# 使用del语句删除指定索引的元素
del s['c']
print(s)
输出结果为:
a 3
b 5
d 8
e 2
dtype: int64
在上面的例子中,我们创建了一个Series对象s
,然后使用del s['c']
删除了索引为'c'
的元素。
与drop()
方法不同,del
语句会直接修改原始的Series对象s
,删除指定的索引元素。
Series如何修改和访问元素
要修改和访问Pandas的Series对象中的元素,可以使用索引标签或位置索引来进行操作。
下面是修改和访问Series对象元素的几种常见方法:
- 通过索引标签访问和修改元素: 可以使用索引标签来访问和修改Series对象中的元素。
import pandas as pd
# 创建一个Series对象
s = pd.Series([3, 5, 1, 8, 2], index=['a', 'b', 'c', 'd', 'e'])
# 访问元素
print(s['c'])
# 修改元素
s['c'] = 10
print(s)
输出结果为:
1
a 3
b 5
c 10
d 8
e 2
dtype: int64
在上面的例子中,我们首先创建了一个Series对象s
,然后使用索引标签['c']
访问了元素1
,接着通过s['c'] = 10
修改了元素的值为10
。
- 通过位置索引访问和修改元素: 可以使用位置索引(整数索引)来访问和修改Series对象中的元素。可以使用
.iloc[]
属性来进行位置索引的操作。
import pandas as pd
# 创建一个Series对象
s = pd.Series([3, 5, 1, 8, 2])
# 访问元素
print(s.iloc[2])
# 修改元素
s.iloc[2] = 10
print(s)
输出结果为:
1
0 3
1 5
2 10
3 8
4 2
dtype: int64
在上面的例子中,我们首先创建了一个Series对象s
,然后使用位置索引2
访问了元素1
,接着通过s.iloc[2] = 10
修改了元素的值为10
。
需要注意的是,使用位置索引时,索引的起始位置是0
。
这些是修改和访问Pandas的Series对象中元素的几种常见方法。您可以根据具体情况选择适合您的方式。
二维数据框DataFrame
DataFrame是Pandas库中最重要的数据结构之一,它是一个二维的表格型数据结构,可以存储和处理具有行索引和列索引的数据。DataFrame类似于电子表格或SQL表,提供了丰富的功能和方法来处理和分析结构化数据。
以下是一些关于DataFrame的重要特点和操作:
- 二维表格结构:DataFrame由行和列组成,行表示数据的观测值或样本,列表示数据的特征或变量。每列可以包含不同的数据类型,例如整数、浮点数、字符串等。
- 行索引和列索引:DataFrame具有行索引和列索引,可以通过索引标签来访问和操作数据。行索引提供了对行的标识和定位,而列索引则提供了对列的标识和定位。
- 灵活的数据操作:DataFrame提供了许多功能强大的方法和函数来处理数据,包括数据的增加、删除、修改、筛选、排序、分组、合并等。可以对整个DataFrame或单独的行、列进行操作。
- 数据对齐:DataFrame具有自动的数据对齐功能,当进行操作时,Pandas会自动对齐具有相同索引的数据。这样可以方便地进行数据合并、计算和处理。
- 缺失数据处理:DataFrame可以处理缺失数据(NaN或None),提供了丰富的方法来处理、填充或删除缺失数据,以便进行后续的数据分析和处理。
- 数据统计和描述:DataFrame提供了许多统计和描述性的方法,如求和、均值、标准差、最大值、最小值、计数等。可以对整个DataFrame或单独的行、列进行统计计算。
- 数据可视化:DataFrame结合了Matplotlib和其他绘图库,可以方便地进行数据可视化,绘制折线图、柱状图、散点图等各种图表。
通过使用DataFrame,可以方便地加载、处理和分析结构化数据,适用于各种数据科学和数据分析任务,如数据清洗、数据转换、数据筛选、数据聚合、数据可视化等。
创建DataFrame
要创建一个DataFrame对象,可以使用Pandas库提供的不同方法,例如传递字典、列表、NumPy数组等数据结构。下面是一些常见的创建DataFrame的方法:
- 通过字典创建DataFrame: 可以使用字典来创建DataFrame,其中字典的键表示列名,字典的值表示列数据。
import pandas as pd
# 创建一个字典
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'London', 'Paris']}
# 通过字典创建DataFrame
df = pd.DataFrame(data)
print(df)
输出结果为:
Name Age City
0 Alice 25 New York
1 Bob 30 London
2 Charlie 35 Paris
在上面的例子中,我们创建了一个字典data
,其中包含三个键值对,分别表示姓名、年龄和城市。然后使用pd.DataFrame()
函数将字典转换为DataFrame对象。
- 通过列表创建DataFrame: 可以使用列表来创建DataFrame,其中每个列表表示一列数据。
import pandas as pd
# 创建列表
name = ['Alice', 'Bob', 'Charlie']
age = [25, 30, 35]
city = ['New York', 'London', 'Paris']
# 通过列表创建DataFrame
df = pd.DataFrame({'Name': name, 'Age': age, 'City': city})
print(df)
输出结果与前面的例子相同。
在上面的例子中,我们创建了三个列表name
、age
和city
,分别表示姓名、年龄和城市数据。然后通过将列表组合成一个字典,并使用pd.DataFrame()
函数将其转换为DataFrame对象。
- 通过NumPy数组创建DataFrame: 还可以使用NumPy数组来创建DataFrame。
import pandas as pd
import numpy as np
# 创建NumPy数组
data = np.array([['Alice', 25, 'New York'],
['Bob', 30, 'London'],
['Charlie', 35, 'Paris']])
# 通过NumPy数组创建DataFrame
df = pd.DataFrame(data, columns=['Name', 'Age', 'City'])
print(df)
输出结果与前面的例子相同。
在上面的例子中,我们创建了一个NumPy数组data
,其中包含了姓名、年龄和城市数据。然后使用pd.DataFrame()
函数将数组转换为DataFrame对象,并通过columns
参数指定列名。
给DataFrame增加数据
要给Pandas的DataFrame对象增加数据,可以使用多种方法,如使用append()
方法、loc
索引标签或使用concat()
函数等。
下面是几种常见的给DataFrame增加数据的方法:
- 使用
append()
方法: 可以使用append()
方法将另一个DataFrame对象追加到当前的DataFrame对象末尾,从而增加数据。
import pandas as pd
# 创建一个空的DataFrame对象
df = pd.DataFrame(columns=['Name', 'Age', 'City'])
# 创建一个新的数据行
new_row = pd.DataFrame({'Name': ['Alice'], 'Age': [25], 'City': ['New York']})
# 使用append()方法追加数据行
df = df.append(new_row)
print(df)
输出结果为:
Name Age City
0 Alice 25 New York
在上面的例子中,我们首先创建了一个空的DataFrame对象df
,然后使用pd.DataFrame()
函数创建了一个新的数据行new_row
。接着使用df.append(new_row)
将new_row
追加到df
的末尾,并将结果重新赋值给df
。
- 使用
loc
索引标签: 可以使用loc
索引标签来直接赋值新增的行数据。
import pandas as pd
# 创建一个空的DataFrame对象
df = pd.DataFrame(columns=['Name', 'Age', 'City'])
# 直接通过loc索引标签赋值新增行数据
df.loc[0] = ['Alice', 25, 'New York']
print(df)
输出结果为:
Name Age City
0 Alice 25 New York
在上面的例子中,我们首先创建了一个空的DataFrame对象df
,然后使用df.loc[0] = ['Alice', 25, 'New York']
通过loc
索引标签将新的行数据赋值给df
。
需要注意的是,通过loc
索引标签赋值时,需要确保索引标签不存在重复,否则会修改已存在的行数据。
- 使用
concat()
函数: 可以使用concat()
函数将多个DataFrame对象按行或列进行连接,从而增加数据。
import pandas as pd
# 创建两个DataFrame对象
df1 = pd.DataFrame({'Name': ['Alice'], 'Age': [25], 'City': ['New York']})
df2 = pd.DataFrame({'Name': ['Bob'], 'Age': [30], 'City': ['London']})
# 使用concat()函数按行连接DataFrame对象
df = pd.concat([df1, df2])
print(df)
输出结果为:
Name Age City
0 Alice 25 New York
0 Bob 30 London
在上面的例子中,我们创建了两个DataFrame对象df1
和df2
,然后使用pd.concat([df1, df2])
按行连接这两个DataFrame对象,并将结果赋值给df
。
给DataFrame删除数据
要删除Pandas的DataFrame对象中的数据,可以使用不同的方法,如使用drop()
函数、dropna()
方法或布尔索引等。
下面是几种常见的删除DataFrame数据的方法:
- 使用
drop()
函数删除行或列: 可以使用drop()
函数删除指定的行或列。
import pandas as pd
# 创建一个DataFrame对象
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'London', 'Paris']})
# 删除指定的行
df = df.drop(1)
# 删除指定的列
df = df.drop('City', axis=1)
print(df)
输出结果为:
Name Age
0 Alice 25
2 Charlie 35
在上面的例子中,我们首先创建了一个DataFrame对象df
,然后使用df.drop(1)
删除了索引为1的行,接着使用df.drop('City', axis=1)
删除了名为’City’的列。
- 使用
dropna()
方法删除含有缺失值的行或列: 可以使用dropna()
方法删除含有缺失值(NaN)的行或列。
import pandas as pd
import numpy as np
# 创建一个含有缺失值的DataFrame对象
df = pd.DataFrame({'Name': ['Alice', 'Bob', np.nan],
'Age': [25, np.nan, 35],
'City': ['New York', 'London', 'Paris']})
# 删除含有缺失值的行
df = df.dropna()
print(df)
输出结果为:
Name Age City
0 Alice 25.0 New York
在上面的例子中,我们创建了一个包含缺失值的DataFrame对象df
,然后使用df.dropna()
删除了含有缺失值的行。
- 使用布尔索引删除符合条件的行: 可以使用布尔索引来删除符合特定条件的行。
import pandas as pd
# 创建一个DataFrame对象
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'London', 'Paris']})
# 删除Age大于等于30的行
df = df[df['Age'] < 30]
print(df)
输出结果为:
Name Age City
0 Alice 25 New York
在上面的例子中,我们首先创建了一个DataFrame对象df
,然后使用布尔索引df['Age'] < 30
筛选出Age
列中小于30的行,并将结果赋值给df
。
访问DataFrame 的各种方式
在Pandas中,有多种方式可以访问DataFrame中的数据。下面介绍了一些常见的访问方式:
- 使用列名访问列数据: 可以使用列名来访问DataFrame中的列数据,类似于访问字典的键值对。
import pandas as pd
# 创建一个DataFrame对象
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'London', 'Paris']})
# 使用列名访问列数据
name_column = df['Name']
age_column = df['Age']
city_column = df['City']
print(name_column)
print(age_column)
print(city_column)
输出结果为:
0 Alice
1 Bob
2 Charlie
Name: Name, dtype: object
0 25
1 30
2 35
Name: Age, dtype: int64
0 New York
1 London
2 Paris
Name: City, dtype: object
在上面的例子中,我们使用df['Name']
、df['Age']
和df['City']
访问了DataFrame对象中的三列数据。
- 使用行索引访问行数据: 可以使用行索引来访问DataFrame中的行数据,类似于访问列表中的元素。
import pandas as pd
# 创建一个DataFrame对象
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'London', 'Paris']})
# 使用行索引访问行数据
first_row = df.loc[0]
second_row = df.loc[1]
third_row = df.loc[2]
print(first_row)
print(second_row)
print(third_row)
输出结果为:
Name Alice
Age 25
City New York
Name: 0, dtype: object
Name Bob
Age 30
City London
Name: 1, dtype: object
Name Charlie
Age 35
City Paris
Name: 2, dtype: object
在上面的例子中,我们使用df.loc[0]
、df.loc[1]
和df.loc[2]
访问了DataFrame对象中的三行数据。
- 使用行列索引访问特定的元素: 可以使用行列索引来访问DataFrame中特定位置的元素,类似于访问二维数组中的元素。
import pandas as pd
# 创建一个DataFrame对象
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'London', 'Paris']})
# 使用行列索引访问特定的元素
value = df.loc[0, 'Name']
print(value)
输出结果为:
Alice
在上面的例子中,我们使用df.loc[0, 'Name']
访问了DataFrame对象中行索引为0、列索引为’Name’的元素。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)