首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【愚公系列】2023年07月 Pandas数据分析之展示

【愚公系列】2023年07月 Pandas数据分析之展示

作者头像
愚公搬代码
发布2025-05-28 15:58:14
发布2025-05-28 15:58:14
20300
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

一、Pandas数据分析之展示

1.Pandas的概念和基本使用

Pandas是一种数据分析工具,是Python中非常流行的库之一,主要用于数据清洗、数据转换、数据分析和数据可视化。Pandas提供了两种重要的数据结构,分别是Series(一维的数据结构)和DataFrame(二维的数据结构)。

Pandas的功能包括:

  • 数据导入和导出:支持从各种数据源中读取数据,如Excel、CSV、SQL等,同时也可以将数据导出到这些源中。
  • 数据预处理:包括缺失值处理、重复值处理、异常值处理、数据类型转换等。
  • 数据分析:包括描述统计分析、聚合分析、透视表分析、时间序列分析等。
  • 数据可视化:可以使用Pandas提供的可视化工具,或与Matplotlib、Seaborn等可视化库结合使用,进行数据可视化分析。

下面是一个示例,首先需要安装pandas库:

代码语言:javascript
代码运行次数:0
运行
复制
pip install pandas

导入库并创建一个DataFrame:

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd

data = {'name': ['Alice', 'Bob', 'Charlie', 'David'],
        'age': [25, 32, 18, 47],
        'gender': ['F', 'M', 'M', 'M'],
        'salary': [5000, 8000, 3500, 6000]}

df = pd.DataFrame(data)

查看DataFrame的数据:

代码语言:javascript
代码运行次数:0
运行
复制
print(df)

输出结果如下:

代码语言:javascript
代码运行次数:0
运行
复制
       name  age gender  salary
0     Alice   25      F    5000
1       Bob   32      M    8000
2   Charlie   18      M    3500
3     David   47      M    6000

对数据进行描述统计分析:

代码语言:javascript
代码运行次数:0
运行
复制
print(df.describe())

输出结果如下:

代码语言:javascript
代码运行次数:0
运行
复制
             age       salary
count   4.000000     4.000000
mean   30.500000  5625.000000
std    11.225255  2062.048144
min    18.000000  3500.000000
25%    23.250000  4625.000000
50%    28.500000  5500.000000
75%    35.750000  6500.000000
max    47.000000  8000.000000

对数据进行透视表分析:

代码语言:javascript
代码运行次数:0
运行
复制
pivot = df.pivot_table(index='gender', values='salary', aggfunc='mean')
print(pivot)

输出结果如下:

代码语言:javascript
代码运行次数:0
运行
复制
           salary
gender           
F            5000
M            5833

对数据进行数据清洗:

代码语言:javascript
代码运行次数:0
运行
复制
df.drop_duplicates(inplace=True)
df.dropna(inplace=True)

上述代码删除了DataFrame中的重复值和空值。

最后,可以将数据导出到Excel文件中:

代码语言:javascript
代码运行次数:0
运行
复制
df.to_excel('data.xlsx', index=False)

2.排序

使用Pandas按列排序更具可读性,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import pandas as pd

#----------------------------数据----------------------------
np_data=np.array([[1,10,100],[2,20,150],[3,15,200],[4,15,80]])

df_data = pd.DataFrame([[1,10,100],[2,20,150],[3,15,200],[4,15,80]],columns=['id','price','weight'],dtype=float)

#----------------------------np排序----------------------------
np_data=np_data[np.argsort(np_data[:,1])]
print(np_data)
print('---------------------------------------------------------')
#----------------------------pd排序----------------------------
df_data=df_data.sort_values('price')
print(df_data)

这里argsort(a[:,1])计算使a的第二列按升序排序的排列,然后a[…]相应地对a的行重新排序。Pandas可以一步完成。

3.按多列排序

如果我们需要使用weight列来对价格列进行排序,情况会变得更糟。这里有几个例子来说明我们的观点:

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import pandas as pd

#----------------------------数据----------------------------
np_data=np.array([[1,10,100],[2,20,150],[3,15,200],[4,15,80]])

df_data = pd.DataFrame([[1,10,100],[2,20,150],[3,15,200],[4,15,80]],columns=['id','price','weight'],dtype=float)

#----------------------------np排序----------------------------
np_data=np_data[np.argsort(np_data[:,2])]
np_data=np_data[np.argsort(np_data[:,1],kind='stable')]
print(np_data)
print('---------------------------------------------------------')
#----------------------------pd排序----------------------------
df_data=df_data.sort_values(['price','weight'])
print(df_data)

在NumPy中,我们先按重量排序,然后再按价格排序。稳定排序算法保证第一次排序的结果不会在第二次排序期间丢失。NumPy还有其他实现方法,但没有一种方法像Pandas那样简单优雅。

4.添加一列

使用Pandas添加列在语法和架构上要好得多。下面的例子展示了如何操作:

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import pandas as pd

#----------------------------数据----------------------------
np_data=np.array([[1,10,100],[2,20,150],[3,15,200],[4,15,80]])

df_data = pd.DataFrame([[1,10,100],[2,20,150],[3,15,200],[4,15,80]],columns=['id','price','weight'],dtype=float)

#----------------------------np添加列----------------------------
np_data=np.column_stack((np_data,np_data[:,1]/np_data[:,2]))
print(np_data)
print('---------------------------------------------------------')
#----------------------------pd添加列----------------------------
df_data['price_pre_gram']=df_data.price/df_data.weight
print(df_data)

Pandas不需要像NumPy那样为整个数组重新分配内存;它只是添加了对新列的引用,并更新了列名的registry

5.快速元素搜索

在NumPy数组中,即使你查找的是第一个元素,你仍然需要与数组大小成正比的时间来查找它。使用Pandas,你可以索引你期望被查询最多的列,并将搜索时间减少到一个常量。

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import pandas as pd

#----------------------------数据----------------------------
np_data=np.array([[100,10,100],[314,20,150],[213,15,200],[432,15,80]])

df_data = pd.DataFrame([[100,10,100],[314,20,150],[213,15,200],[432,15,80]],columns=['id','price','weight'],dtype=float)

#----------------------------np添加列----------------------------
value=np_data[np.where(np_data==213)[0][0]][2] # 时间复杂度 O(N)
print(value)
print('---------------------------------------------------------')
#----------------------------pd添加列----------------------------
value=df_data.loc[df_data.id==213,'weight'].item() # 时间复杂度 O(N)
print(value)
df_data.set_index('id',inplace=True)
value=df_data.loc[213,'weight'] # 时间复杂度 O(1)
df_data.reset_index(inplace=True)
print(value)

index列有以下限制。

  • 它需要内存和时间来构建。
  • 它是只读的(需要在每次追加或删除操作后重新构建)。
  • 这些值不需要是唯一的,但是只有当元素是唯一的时候加速才会发生。
  • 它需要预热:第一次查询比NumPy稍慢,但后续查询明显快得多。

6.按列连接(join)

如果你想从另一张表中获取基于同一列的信息,NumPy几乎没有任何帮助。Pandas更好,特别是对于1:n的关系。

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import pandas as pd

#----------------------------数据----------------------------

sales = pd.DataFrame([['John',1],['Silvia',3],['Andrew',1]],columns=['client','product_id'],dtype=float)

products = pd.DataFrame([[1,'banana'],[2,'apple'],[3,'orange']],columns=['id','name'],dtype=float)

#----------------------------pd添加列----------------------------
value=sales.join(products.set_index('id'),on='product_id')
print(value)

Pandas join具有所有熟悉的“内”、“左”、“右”和“全外部”连接模式。

7.按列分组

数据分析中的另一个常见操作是按列分组。例如,要获得每种产品的总销量,你可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import pandas as pd

#----------------------------数据----------------------------

sales = pd.DataFrame([['John',1,5],['Silvia',3,3],['Andrew',1,4]],columns=['client','product_id','quantity'],dtype=float)

products = pd.DataFrame([[1,'banana'],[2,'apple'],[3,'orange']],columns=['id','name'],dtype=float)

#----------------------------pd添加列----------------------------
# join
value=sales.join(products.set_index('id'),on='product_id')
print(value)
# group
value=value.groupby('name',as_index=False).sum('quantity')
print(value)

除了sum之外,Pandas还支持各种聚合函数:mean、max、min、count等。

8. 数据透视表

Pandas最强大的功能之一是“枢轴”表。这有点像将多维空间投影到二维平面上。

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import pandas as pd

#----------------------------数据----------------------------

sales = pd.DataFrame([['John','bananas',5],['John','oranges',3],['Silvia','bananas',4],['Silvia','oranges',2]],columns=['client','product','quantity'],dtype=float)


#----------------------------pd添加列----------------------------

pivot_value=sales.pivot(index='client',columns='product',values='quantity')
print(pivot_value)

虽然用NumPy当然可以实现它,但这个功能没有开箱即用,尽管它存在于所有主要的关系数据库和电子表格应用程序(Excel,WPS)中。

Pandas用df.pivot_table将分组和旋转结合在一个工具中。

简而言之,NumPy和Pandas的两个主要区别如下:

9. Pandas性能

9.1 Pandas通用比较

对于小数组(少于100行),Pandas似乎比NumPy慢30倍,对于大数组(超过100万行)则慢3倍。

9.2 Pandas详细比较

Pandas在这些基本操作方面非常缓慢,因为它正确地处理了缺失值。Pandas需要NaNs (not-a-number)来实现所有这些类似数据库的机制,比如分组和旋转,而且这在现实世界中是很常见的。在Pandas中,我们做了大量工作来统一所有支持的数据类型对NaN的使用。根据定义(在CPU级别上强制执行),nan+anything会得到nan。所以

代码语言:javascript
代码运行次数:0
运行
复制
>>> np.sum([1, np.nan, 2])  
nan

但是

代码语言:javascript
代码运行次数:0
运行
复制
>>> pd.Series([1, np.nan, 2]).sum()  
3.0

一个公平的比较是使用np.nansum代替np.sum,用np.nanmean而不是np.mean等等。

对于超过100万个元素的数组,Pandas的速度是NumPy的1.5倍。对于较小的数组,它仍然比NumPy慢15倍,但通常情况下,无论操作在0.5 ms还是0.05 ms内完成都没有太大关系——无论如何它都是快速的。

对于超过100万个元素的数组,Pandas的速度是NumPy的1.5倍。对于较小的数组,它仍然比NumPy慢15倍,但通常情况下,无论操作在0.5 ms还是0.05 ms内完成都没有太大关系——无论如何它都是快速的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Pandas数据分析之展示
    • 1.Pandas的概念和基本使用
    • 2.排序
    • 3.按多列排序
    • 4.添加一列
    • 5.快速元素搜索
    • 6.按列连接(join)
    • 7.按列分组
    • 8. 数据透视表
    • 9. Pandas性能
      • 9.1 Pandas通用比较
      • 9.2 Pandas详细比较
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档