文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python之Pandas使用详解

2023-09-05 08:32

关注

Pandas

在数据分析当中,我们通常使用 Pandas 来做数据清理的工作。在真实的工作生活中,我们拿到的数据往往都是不整洁的,空值、重复值、无效值等等信息都会干扰我们的分析,此时我们就需要按部就班的完成数据的清理。数据清理是数据分析中非常重要的一步,也是非常繁琐的一步,当然,在你掌握了 Pandas 库之后,你就好像是得到了一把削铁如泥的宝剑,数据清理工作的效率会大大提高。

Pandas 主要有两种数据结构,分别是 Series 和 DataFrame,他们分别表示一维的序列和二维的表结构。

维数名称描述
1Series可以看做有标签(默认是整数序列 RangeIndex;可以重复)的一维数组(同类型)。是 scalars(标量) 的集合,同时也是 DataFrame 的元素。
2DataFrame一般是二维标签,尺寸可变的表格结构,具有潜在的异质型列。

Series

Series 是一个定长的字典序列。它相当于是两个 ndarray,一个代表 index,一个代表 values。

import pandas as pds = pd.Series(data, index=index)

此处的 data,可以是如下的数据类型:

而 index 的默认值是 0,1,2… 递增的整数序列。

指定 index

s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])print(s)>>>a   -0.595567b   -0.201314c    1.516812d    0.102395e   -1.009924dtype: float64

不指定 index

s1 = pd.Series(['a', 'b', 'c', 'd'])print(s1)>>>0    a1    b2    c3    ddtype: object

通过字典来创建 Series

d= {'a': 1, 'b': 2, 'c': 3}s2 = pd.Series(d)print(s2)>>>a    1b    2c    3dtype: int64

DataFrame

DataFrame 是一个二维的数据结构,可以把它理解为数据表格或者是 SQL 表,或者是由 Series 对象组成的字典。

d = {"Chinese": [80, 85, 90], "Math": [85, 70, 95], "English": [90, 95, 90]}df1 = pd.DataFrame(d)print(df1)df2 = pd.DataFrame(d, index=['zhangsan', 'lisi', 'wangwu'])print(df2)print(df2.columns, df2.index)>>>   Chinese  Math  English0       80    85       901       85    70       952       90    95       90          Chinese  Math  Englishzhangsan       80    85       90lisi           85    70       95wangwu         90    95       90Index(['Chinese', 'Math', 'English'], dtype='object') Index(['zhangsan', 'lisi', 'wangwu'], dtype='object')

通过 index 选择 DataFrame 中的数据

操作语法结果类型
选择某一列df[col]Series
通过标签选择某一行df.loc[label]Series
通过标签位置选择某一行df.iloc[loc]Series
切片获取某些行df[5:10]DataFrame
通过布尔向量获取某些行df[bool_vec]DataFrame

代码

print(df2['Chinese'], '\n')print(df2.loc['zhangsan'], '\n')print(df2.iloc[-1], '\n')print(df2[0:2], '\n')print(df2[df2>85], '\n')>>>zhangsan    80lisi        85wangwu      90Name: Chinese, dtype: int64 Chinese    80Math       85English    90Name: zhangsan, dtype: int64 Chinese    90Math       95English    90Name: wangwu, dtype: int64           Chinese  Math  Englishzhangsan       80    85       90lisi           85    70       95           Chinese  Math  Englishzhangsan      NaN   NaN       90lisi          NaN   NaN       95wangwu       90.0  95.0       90 

读取/保存数据

读取数据

df = pd.read_csv("test.csv")print(df.head())print('\n')print(type(df))>>>       name   age     score0  zhangsan  30.0      80.01      lisi  20.0       NaN2    wangwu  25.0  100000.03   zhaoliu   NaN      32.04      maqi  33.0      60.0

保存数据

df.to_csv('my.csv')df.to_excel('my.xlsx')

查看数据

print(df.index, '\n')print(df.columns, '\n')print(df.to_numpy(), '\n')print(df.describe())>>>RangeIndex(start=0, stop=5, step=1) Index(['name', 'age', 'score'], dtype='object') [['zhangsan' 30.0 80.0] ['lisi' 20.0 nan] ['wangwu' 25.0 100000.0] ['zhaoliu' nan 32.0] ['maqi' 33.0 60.0]]              age          scorecount   4.000000       4.000000mean   27.000000   25043.000000std     5.715476   49971.337211min    20.000000      32.00000025%    23.750000      53.00000050%    27.500000      70.00000075%    30.750000   25060.000000max    33.000000  100000.000000

describe 是非常常用的函数,可以通过它来在整体上查看数据的全貌,有助于了解数据。

排序

按轴排序

print(df.sort_index(axis=1, ascending=False))>>>      score      name   age0      80.0  zhangsan  30.01       NaN      lisi  20.02  100000.0    wangwu  25.03      32.0   zhaoliu   NaN4      60.0      maqi  33.0

按数值排序

print(df.sort_values(by='score'))>>>       name   age     score3   zhaoliu   NaN      32.04      maqi  33.0      60.00  zhangsan  30.0      80.02    wangwu  25.0  100000.01      lisi  20.0       NaN

缺失值

查看缺失值

print(df.isnull(),'\n')print(df.isnull().any())>>>    name    age  score0  False  False  False1  False  False   True2  False  False  False3  False   True  False4  False  False  False name     Falseage       Truescore     Truedtype: bool

可以方便的看出数据中,哪些列是存在空值的。

删除/填充空值

df1 = df.copy()print(df1, '\n')print(df1.dropna(how='any'), '\n')print(df1.fillna(value=50))>>>       name   age     score0  zhangsan  30.0      80.01      lisi  20.0       NaN2    wangwu  25.0  100000.03   zhaoliu   NaN      32.04      maqi  33.0      60.0        name   age     score0  zhangsan  30.0      80.02    wangwu  25.0  100000.04      maqi  33.0      60.0        name   age     score0  zhangsan  30.0      80.01      lisi  20.0      50.02    wangwu  25.0  100000.03   zhaoliu  50.0      32.04      maqi  33.0      60.0

常用操作

重命名列

df1.rename(columns={'name': 'student'}, inplace = True)print(df1)>>>    student   age     score0  zhangsan  30.0      80.01      lisi  20.0       NaN2    wangwu  25.0  100000.03   zhaoliu   NaN      32.04      maqi  33.0      60.0

删除列/行

df1 = df1.drop(columns=['age'])print(df1, '\n')df1 = df1.drop(index=[1])print(df1)>>>    student     score0  zhangsan      80.01      lisi       NaN2    wangwu  100000.03   zhaoliu      32.04      maqi      60.0     student     score0  zhangsan      80.02    wangwu  100000.03   zhaoliu      32.04      maqi      60.0

去除重复值

df = df.drop_duplicates() # 去除重复行

修改数据格式

df1['score'].astype('str')

apply 函数的应用
apply 用来将函数应用到数据上。

df2 = df1['score'].apply(lambda x: x * 2)print(df2)>>>0       160.02    200000.03        64.04       120.0Name: score, dtype: float64

以上代码等价于

list(map(lambda x: x*2, df1['score']))>>>[160.0, 200000.0, 64.0, 120.0]

由此可以看出,apply 是一个高效且简洁的函数,可以快速把函数作用到每个元素之上。

直方图化

所谓的直方图化,就是函数 value_counts,该函数可以查看数据中,每列中有多少不同值,且各个不同值出现的次数

print(df, '\n')df3 = df.fillna(60)df3.loc[5] = ['qianba', 20, 80]  # 新增一行print(df3['score'].value_counts())>>>       name   age     score0  zhangsan  30.0      80.01      lisi  20.0       NaN2    wangwu  25.0  100000.03   zhaoliu   NaN      32.04      maqi  33.0      60.0 60.0        280.0        232.0        1100000.0    1Name: score, dtype: int64

表格合并及分组

合并

使用 concat 连接两个 Pandas 对象

print(df3, '\n')df4 = df3.copy()df3 = pd.concat([df3, df4], ignore_index=True)print(df3)>>>       name   age     score0  zhangsan  30.0      80.01      lisi  20.0      60.02    wangwu  25.0  100000.03   zhaoliu  60.0      32.04      maqi  33.0      60.05    qianba  20.0      80.0         name   age     score0   zhangsan  30.0      80.01       lisi  20.0      60.02     wangwu  25.0  100000.03    zhaoliu  60.0      32.04       maqi  33.0      60.05     qianba  20.0      80.06   zhangsan  30.0      80.07       lisi  20.0      60.08     wangwu  25.0  100000.09    zhaoliu  60.0      32.010      maqi  33.0      60.011    qianba  20.0      80.0

使用 merge 函数

基于某一列进行连接

left = pd.DataFrame({'key': ['foo', 'bar', 'loo'], 'lval': [1, 2, 3]})right = pd.DataFrame({'key': ['foo', 'bar', 'roo'], 'rval': [3, 4, 5]})print(left, '\n')print(right, '\n')print(pd.merge(left, right, on='key'))>>>   key  lval0  foo     11  bar     22  loo     3    key  rval0  foo     31  bar     42  roo     5    key  lval  rval0  foo     1     31  bar     2     4

内连接(innert),取键的交集

print(pd.merge(left, right, how='inner'))>>>   key  lval  rval0  foo     1     31  bar     2     4

还有左连接、右连接和外连接,你可以自己尝试下,看看有什么区别。

分组

所谓的分组,就是根据一些标准,将数据分解成一些组,将函数独立的应用到每个组上,最后将结果组合成数据结构。

df = pd.DataFrame({'A': ['foo', 'bar', 'bar', 'foo', 'foo', 'foo'],'B': ['one', 'two', 'three', 'one', 'two', 'two'],'C':[1, 2, 3, 4, 5, 6]})print(df, '\n')print(df.groupby('A').sum(), '\n')print(df.groupby('B').sum())>>>     A      B  C0  foo    one  11  bar    two  22  bar  three  33  foo    one  44  foo    two  55  foo    two  6       CA      bar   5foo  16         CB        one     5three   3two    13

也可以按照多列分组

print(df.groupby(['A', 'B']).sum())>>>            CA   B        bar three   3    two     2foo one     5    two    11

绘制简单图表

Pandas 同样提供绘制图表的功能

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2018', periods=1000))print(ts, '\n')ts = ts.cumsum()  # 返回累计值ts.plot()>>>2018-01-01    1.0552292018-01-02    0.1014672018-01-03   -2.0835372018-01-04    1.1781022018-01-05   -0.084247                ...   2020-09-22   -4.3167702020-09-23   -0.8234942020-09-24    0.2151992020-09-25    1.0945162020-09-26    0.285788Freq: D, Length: 1000, dtype: float64 Out[94]:

图片

 

来源地址:https://blog.csdn.net/huanxiajioabu/article/details/131846118

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯