【python】数据分析——Pandas、Series、DataFrame

Pandas介绍

Pandas 是一个基于 NumPy 的 Python 数据处理库,提供了高效的数据结构和数据分析工具,使得在处理和分析结构化数据变得更加简单和快速。

以下是 Pandas 的一些主要功能和特点:

  1. 数据结构:Pandas 提供了两种主要的数据结构:Series 和 DataFrame。
    • Series 是一维标记数组,类似于带有标签的 NumPy 数组。它支持整数、浮点数、字符串等各种数据类型,并且可以根据位置或标签进行索引。
    • DataFrame 是一个二维标签数据结构,类似于表格或电子表格。它由多个行和列组成,每列可以包含不同的数据类型。DataFrame 可以理解为多个 Series 对象的集合。
  2. 数据处理和操作:Pandas 提供了丰富的函数和方法来进行数据处理和操作。
    • 数据清洗:Pandas 提供了各种用于处理缺失值、重复值和异常值的函数,如填充、删除和替换等。
    • 数据过滤和选择:Pandas 提供了灵活的方式来选择、筛选和过滤数据,可以根据条件、标签或位置进行选择。
    • 数据排序和排名:Pandas 允许对数据进行排序并排名,包括按照某列或多列进行排序。
    • 数据统计和聚合:Pandas 提供了丰富的统计和聚合函数,如求和、均值、中位数、方差、分组等。
  3. 数据读写:Pandas 可以轻松地读取和写入各种数据格式,包括 CSV、Excel、SQL 数据库、JSON、HDF5 等。
  4. 时间序列数据处理:Pandas 对于时间序列数据的处理非常强大,提供了许多用于处理时间和日期的功能和方法。
  5. 数据可视化:Pandas 结合了 Matplotlib 库,可以通过简单的方法进行基本的数据可视化,如绘制折线图、柱状图和散点图等。

总之,Pandas 是一个功能强大且灵活的数据处理工具,它使得在 Python 中进行数据清洗、处理和分析变得更加容易和高效。它广泛应用于数据科学、机器学习、金融分析和其他数据相关的领域。

Pandas基础

import pandas as pd

print(pd.__version__)	#2.1.0

Series

创建

1.从列表或数组创建

s1 = pd.Series([1,3,2])
print(s1)
print(s1.index)
"""
0    1
1    3
2    2
dtype: int64
RangeIndex(start=0, stop=3, step=1)
"""

2.从字典创建:

s2 = pd.Series({'长沙':1.1,'株洲':1.2})
s2.name = '城市'
print(s2)
print(s2.index)
"""
长沙    1.1
株洲    1.2
Name: 城市, dtype: float64
Index(['长沙', '株洲'], dtype='object')
"""

访问数据

series[0]  # 访问第一个元素
series['a']  # 根据标签访问元素

增加元素

  • 使用索引赋值:通过指定索引,可以直接为 Series 添加新的元素。
  series['d'] = 60  # 在索引 'd' 处添加元素 60
  • 使用 pd.concat() 方法,创建一个新的 Series new_series
data = [10, 20]
series = pd.Series(data)

new_element = 30
new_series = pd.concat([series, pd.Series([new_element])])

print(new_series)
  • 使用pd._append()方法
series = pd.Series({'长沙':1.1,'株洲':1.2})
new_series = series._append(pd.Series({'湘潭':1.3}))

print(new_series)

删除操作

  • 使用 drop() 方法删除指定索引的元素(生成新的 Series)
data = [10, 20, 30, 40, 50]
series = pd.Series(data)
index_to_drop = 2  # 要删除的元素的索引
new_series = series.drop(index_to_drop)
print(new_series)
  • 使用索引切片删除指定位置的元素(生成新的 Series)
data = [10, 20, 30, 40, 50]
series = pd.Series(data)
index_to_drop = 2  # 要删除的元素的索引
new_series = series[series.index != index_to_drop]
print(new_series)
  • 使用 del 关键字删除指定位置的元素(对原始的 Series 进行修改)
data = [10, 20, 30, 40, 50]
series = pd.Series(data)
index_to_drop = 2  # 要删除的元素的索引
del series[index_to_drop]
print(series)

切片操作

series[1:4]  # 获取索引 1 至索引 3 的元素

矢量化操作

Pandas 具有广播功能,使得可以在整个 Series 中进行矢量化操作。

series * 2  # 将 Series 中的每个元素乘以 2

过滤操作

series[series > 20]  # 返回大于 20 的元素

其他常用操作

求和、均值、计数、查找唯一值等操作也是很常见的,可以使用相应的方法进行处理。

series.sum()  # 求和
series.mean()  # 均值
series.count()  # 计数
series.unique()  # 查找唯一值

DataFrame

DataFrame 是一个二维的、表格型的数据结构,可以容纳不同数据类型的列。

创建

data = [10, 20, 30, 40, 50]
series = pd.Series(data)
df = pd.DataFrame(series, columns=['Column Name'])
print(df)
"""
   Column Name
0           10
1           20
2           30
"""

df1 = pd.DataFrame([['⼩红', 27, 1.63],['⼩张', 30, 1.78]],
columns=['姓名','年龄','身⾼'],
index=['index0', 'index1'])
print(df1)
"""
        姓名  年龄    身⾼
index0  ⼩红  27  1.63
index1  ⼩张  30  1.78
"""

data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
        'Age': [25, 30, 35, 40],
        'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)
print(df)
"""
      Name  Age  Salary
0    Alice   25   50000
1      Bob   30   60000
2  Charlie   35   70000
3    David   40   80000
"""
#导入csv文件
df = pd.read_csv('supplier_factory_info_test.csv')
print(df)

查看数据

  • 使用 head() 方法查看前几行数据,默认为前 5 行。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
        'Age': [25, 30, 35, 40],
        'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)

# 查看前 3 行数据
print(df.head(3))

输出结果为:

     Name  Age  Salary
0     Alice   25   50000
1       Bob   30   60000
2   Charlie   35   70000

增加数据

  • 使用 lociloc 来新增一行或多行数据。
# 创建空的 DataFrame
df = pd.DataFrame(columns=['Name', 'Age'])

# 增加一行数据
df.loc[0] = ['Alice', 25]

# 增加多行数据
df.loc[1] = ['Bob', 30]
df.loc[2] = ['Charlie', 35]

print(df)

输出结果为:

     Name Age
0    Alice  25
1      Bob  30
2  Charlie  35
  • 使用._append()添加数据
df1 = pd.DataFrame([['⼩红', 27, 1.63],['⼩张', 30, 1.78]],
columns=['姓名','年龄','身⾼'],
index=['index0', 'index1'])

s1 = pd.Series({"姓名":"⼩王", "年龄":25, "身⾼":1.67})
s1.name = "index2"

df2 = df1._append(s1)
print(df2)

输出结果为:

        姓名  年龄    身⾼
index0  ⼩红  27  1.63
index1  ⼩张  30  1.78
index2  ⼩王  25  1.67

删除数据

  • 使用 drop() 方法删除指定行或列的数据。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35]}
df = pd.DataFrame(data)

# 删除指定行
df = df.drop(1)  # 删除索引为 1 的行

# 删除指定列
df = df.drop('Age', axis=1)  # 删除名为 'Age' 的列

print(df)

输出结果为:

   Name
0  Alice
2  Charlie

访问列

  • 使用列名可以直接访问对应的列数据。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
        'Age': [25, 30, 35, 40],
        'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)

# 访问 Name 列数据
print(df['Name'])

输出结果为:

0       Alice
1         Bob
2     Charlie
3       David
Name: Name, dtype: object

描述性统计

  • 使用 describe() 方法可以输出数据的基本统计信息。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
        'Age': [25, 30, 35, 40],
        'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)

# 描述性统计
print(df.describe())

输出结果为:

         Age        Salary
count   4.000000      4.00000
mean   32.500000  65000.00000
std     6.454972  12909.94449
min    25.000000  50000.00000
25%    28.750000  57500.00000
50%    32.500000  65000.00000
75%    36.250000  72500.00000
max    40.000000  80000.00000

数据筛选

  • 使用条件筛选可以选择符合特定条件的数据行。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
        'Age': [25, 30, 35, 40],
        'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)

# 筛选 Age 大于 30 的数据行
filtered_df = df[df['Age'] > 30]
print(filtered_df)

输出结果为:

      Name  Age  Salary
2   Charlie   35   70000
3     David   40   80000

排序

  • 使用 sort_values() 方法可以按照指定的列进行排序。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
        'Age': [25, 30, 35, 40],
        'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)

# 按照 Salary 列进行升序排序
sorted_df = df.sort_values('Salary')
print(sorted_df)

输出结果为:

      Name  Age  Salary
0     Alice   25   50000
1       Bob   30   60000
2   Charlie   35   70000
3     David   40   80000

DataFrame行级遍历

iterrows() 方法

iterrows() 方法可以返回一个迭代器,通过迭代器可以遍历每一行的索引和数据。示例如下:

# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35]}
df = pd.DataFrame(data)

# 使用 iterrows() 进行行级遍历
for index, row in df.iterrows():
    print(f"Index: {index}, Name: {row['Name']}, Age: {row['Age']}")

输出结果为:

Index: 0, Name: Alice, Age: 25
Index: 1, Name: Bob, Age: 30
Index: 2, Name: Charlie, Age: 35

注意:iterrows() 方法返回的是每行的索引和一个包含行数据的 Series 对象。

itertuples() 方法

itertuples() 方法返回一个迭代器,通过迭代器可以遍历每一行数据的命名元组。示例如下:

# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35]}
df = pd.DataFrame(data)

# 使用 itertuples() 进行行级遍历
for row in df.itertuples(index=False):
    print(f"Name: {row.Name}, Age: {row.Age}")

输出结果为:

Name: Alice, Age: 25
Name: Bob, Age: 30
Name: Charlie, Age: 35

注意:itertuples() 方法返回的是一个命名元组对象,可以通过属性访问每行的数据。

操纵DataFrame的索引

set_index()方法

set_index() 方法可以通过指定某一列作为新的索引。示例如下:

# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35]}
df = pd.DataFrame(data)

# 使用 set_index() 设置新的索引列
df = df.set_index('Name')

print(df)

输出结果为:

       Age
Name       
Alice    25
Bob      30
Charlie  35

reset_index() 方法

reset_index() 方法可以重置索引,将当前索引列变为普通列,并重新生成默认的数字索引。示例如下:

# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)

# 使用 reset_index() 重置索引
df = df.reset_index()
print(df)

输出结果为:

      Name  Age
0    Alice   25
1      Bob   30
2  Charlie   35
     index   Name  Age
0      0    Alice   25
1      1      Bob   30
2      2  Charlie   35

直接操作索引属性

可以直接修改 DataFrame 的索引属性 index 来改变索引的值。示例如下:

# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35]}
df = pd.DataFrame(data)

# 修改索引值
df.index = ['a', 'b', 'c']

print(df)

输出结果为:

     Name  Age
a    Alice   25
b      Bob   30
c  Charlie   35

DataFrame的列自动对齐

当进行 pandas 的列级操作时(如相加、相减、相乘等),Pandas 利用列的标签在操作过程中对齐数据。如果两个 DataFrame 具有不同的索引,Pandas 会首先将它们重新索引以对齐行,然后再根据列的标签对齐数据。

# 创建两个 DataFrame
data1 = {'A': [1, 2, 3],
         'B': [4, 5, 6]}
df1 = pd.DataFrame(data1)

data2 = {'A': [7, 8, 9],
         'C': [10, 11, 12]}
df2 = pd.DataFrame(data2)

# 对两个 DataFrame 进行相加操作
df_sum = df1 + df2
print(df_sum)

输出结果为:

    A   B   C
0   8 NaN NaN
1  10 NaN NaN
2  12 NaN NaN

没有匹配的行或列时,Pandas 使用 NaN(缺失值)来填充。

DataFrame 分组操作

按照单个列进行分组

# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob'],
        'Age': [25, 30, 35, 28, 32],
        'City': ['New York', 'Paris', 'London', 'Tokyo', 'Paris'],
        'Salary': [5000, 6000, 7000, 5500, 6500]}
df = pd.DataFrame(data)

# 按照 'Name' 列进行分组,并计算每个分组的平均年龄和平均工资
grouped = df.groupby('Name')
result = grouped[['Age','Salary']].mean()
print(result)

输出结果为:

          Age  Salary
Name                 
Alice    26.5  5250.0
Bob      31.0  6250.0
Charlie  35.0  7000.0

传递多个列名进行多层次的分组

# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob'],
        'Age': [25, 30, 35, 28, 32],
        'City': ['New York', 'Paris', 'London', 'Tokyo', 'Paris'],
        'Salary': [5000, 6000, 7000, 5500, 6500]}
df = pd.DataFrame(data)

#传递多个列名以进行多层次的分组
grouped = df.groupby(['Name', 'City'])
result = grouped.mean()
print(result)

输出结果为:

                   Age  Salary
Name    City                  
Alice   New York  25.0  5000.0
        Tokyo     28.0  5500.0
Bob     Paris     31.0  6250.0
Charlie London    35.0  7000.0

该代码将 DataFrame 按照 ‘Name’ 列和 ‘City’ 列进行分组,并计算每个分组的平均值。

在进行分组后,还可以对每个分组应用其他函数或方法(如 sum()count()max()min() 等),以生成更多的汇总统计信息。

使用主键连接2个DataFrame

merge()函数

df1 = pd.DataFrame({'地区':['北京','⼭东','天津'],'⼈⼝':[1.2, 1.1, 0.7]})
df2 = pd.DataFrame({'地区':['北京','⼭东', '陕⻄'],'省会':['北京', '济南', '⻄安']})

merged_df = df1.merge(df2, on='地区')
print(merged_df)

输出结果为:

   地区   ⼈⼝  省会
0  北京  1.2  北京
1  ⼭东  1.1  济南

join()函数

df1 = pd.DataFrame({'地区':['北京','⼭东','天津'],'⼈⼝':[1.2, 1.1, 0.7]})
df2 = pd.DataFrame({'地区':['北京','⼭东', '陕⻄'],'省会':['北京', '济南', '⻄安']})

joined_df = df1.join(df2, lsuffix='_左表', rsuffix='_右表')
print(joined_df)

输出结果为:

  地区_左表   ⼈⼝ 地区_右表  省会
0    北京  1.2    北京  北京
1    ⼭东  1.1    ⼭东  济南
2    天津  0.7    陕⻄  ⻄安

注意.join()方法是针对索引进行连接的,而不是基于指定的列进行连接。如果希望基于指定的列进行连接,使用.merge()方法。

数据透视

.pivot_table()

# 创建一个DataFrame
data = {
    '城市': ['北京', '上海', '北京', '上海', '北京', '上海'],
    '部门': ['销售', '销售', '财务', '财务', '人力资源', '人力资源'],
    '员工': ['小明', '小红', '小李', '小王', '小张', '小陈'],
    '销售额': [10000, 15000, 8000, 12000, 9000, 11000]
}
df = pd.DataFrame(data)
print(df)

# 进行数据透视
pivot_df = df.pivot_table(values='销售额', index='城市', columns='部门', aggfunc='sum')
print(pivot_df)

输出结果为:

   城市    部门  员工    销售额
0  北京    销售  小明  10000
1  上海    销售  小红  15000
2  北京    财务  小李   8000
3  上海    财务  小王  12000
4  北京  人力资源  小张   9000
5  上海  人力资源  小陈  11000


部门   人力资源     财务     销售
城市                     
上海  11000  12000  15000
北京   9000   8000  10000
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zz的学习笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值