• Pandas-03(字符串与文本数据、索引和选择数据、统计函数、窗口函数)


    目录

    1.字符串与文本数据

    2. 索引和选择数据

    2.1 .loc()按标签进行选择

    2.2 .iloc()按位置进行选择

    2.3 使用属性获取数据

    3.  统计函数

    3.1 百分比变化.pct_change()

    3.2 协方差.cov()

    3.3 相关性.corr()

    3.4 数据排名.rank()

    4. 窗口函数


    1.字符串与文本数据

    Series 支持字符串处理方法,可以非常方便地操作数组里的每个元素。这些方法会自动排除缺失值与空值,这也许是其最重要的特性。这些方法通过 Series 的 str 属性访问,一般情况下,这些操作的名称与内置的字符串方法一致,例如.lower();.upper();.len()等基础方法。

    示例:

    1. import pandas as pd
    2. import numpy as np
    3. s = pd.Series([' Tom ',' xiaoming ',' john '])
    4. s
    5. #删除空格
    6. s.str.strip()
    7. #字符串分割
    8. s.str.split('o')
    9. #字符串拼接
    10. s.str.cat(sep="<=>")
    11. #辨别分类
    12. s.str.get_dummies()
    13. #字符串包含的内容
    14. s.str.contains('m')
    15. #字符串替换
    16. s.str.replace('o',"dd")
    17. #计数
    18. s.str.count('i')
    19. #对一系列字符串判断是否是数字
    20. s = pd.Series([' Tom ','778899',' xiaoming ',' john '])
    21. s.str.isnumeric()

    输出结果:

    1. # 原始Series
    2. 0 Tom
    3. 1 xiaoming
    4. 2 john
    5. dtype: object
    6. # 删除空格
    7. 0 Tom
    8. 1 xiaoming
    9. 2 john
    10. dtype: object
    11. # 字符串以o进行分割
    12. 0 [ T, m ]
    13. 1 [ xia, ming ]
    14. 2 [ j, hn ]
    15. dtype: object
    16. # 字符串拼接
    17. ' Tom <=> xiaoming <=> john '
    18. # 辨别分类
    19. Tom john xiaoming
    20. 0 1 0 0
    21. 1 0 0 1
    22. 2 0 1 0
    23. # 字符串包含的内容
    24. 0 True
    25. 1 True
    26. 2 False
    27. dtype: bool
    28. # 字符串替换
    29. 0 Tddm
    30. 1 xiaddming
    31. 2 jddhn
    32. dtype: object
    33. # 计数(字符串中i的数量)
    34. 0 0
    35. 1 2
    36. 2 0
    37. dtype: int64
    38. # 对一系列字符串判断是否是数字
    39. 0 False
    40. 1 True
    41. 2 False
    42. 3 False
    43. dtype: bool

    2. 索引和选择数据

    在pandas中,除了使用index下标或column列名索引外,还可以使用.loc();.iloc()进行数据索引。

    2.1 .loc()按标签进行选择

    pandas 提供了一套方法来实现纯粹的基于标签的索引。这是一个严格的基于包含的协议。要求的每个标签都必须在索引中,否则KeyError将被提出。切片时,如果索引中存在,则包括起始边界停止边界。整数是有效的标签,但它们指的是标签而不是位置

    .loc属性是主要的访问方法。以下是有效输入:

    • 单个标签,例如5'a'(请注意,它5被解释为索引的标签。此用法不是沿索引的整数位置。)。

    • 标签列表或数组。['a', 'b', 'c']

    • 带有标签的切片对象'a':'f'(请注意,与通常的 Python 切片相反,开始和停止包含在索引中!请参阅带标签的切片

    • 一个布尔数组。

    • callable,请参阅按 Callable 选择

    示例:随机生成一个八行撕裂的数据进行操作

    1. import pandas as pd
    2. import numpy as np
    3. df = pd.DataFrame(np.random.randn(8,4),index=['a','b','c','d','e','f','g','h'],columns=["A","B","C","D"])
    4. df
    5. # 输出结果
    6. A B C D
    7. a 0.529671 -0.076485 0.379469 1.494926
    8. b -0.082312 -0.328869 0.175183 -0.798430
    9. c 0.681922 0.741320 -0.910726 -2.176608
    10. d 1.500632 -1.165229 0.316722 0.402977
    11. e -2.044217 0.930242 0.433050 0.542472
    12. f 1.332038 0.476599 1.661994 2.102483
    13. g 0.488362 -1.667154 -0.651079 -0.049332
    14. h -0.676308 0.904894 1.592176 0.409881

    1. 选择AB列的所有内容(使用切片)

    1. #选择A.B列所有的内容,基于标签
    2. df.loc[:,['A','B']]
    3. #输出结果
    4. A B
    5. a 0.529671 -0.076485
    6. b -0.082312 -0.328869
    7. c 0.681922 0.741320
    8. d 1.500632 -1.165229
    9. e -2.044217 0.930242
    10. f 1.332038 0.476599
    11. g 0.488362 -1.667154
    12. h -0.676308 0.904894

    2.  选择a-e行,b以后的列(切片)

    1. #选择a-e行,b以后的列
    2. df.loc['a':'e','B':]
    3. # 输出结果:
    4. B C D
    5. a -0.076485 0.379469 1.494926
    6. b -0.328869 0.175183 -0.798430
    7. c 0.741320 -0.910726 -2.176608
    8. d -1.165229 0.316722 0.402977
    9. e 0.930242 0.433050 0.542472

    3. 取出a标签中大于1的数据

    1. # 取出a标签里大于一的数据
    2. df.loc['a']>1
    3. # 输出结果
    4. A False
    5. B False
    6. C False
    7. D True
    8. Name: a, dtype: bool

    4.  取出a大于1的那一列内容

    1. # 取出a大于1的那一列内容
    2. df.loc[:,df.loc['a']>1]
    3. #输出结果:
    4. D
    5. a 1.494926
    6. b -0.798430
    7. c -2.176608
    8. d 0.402977
    9. e 0.542472
    10. f 2.102483
    11. g -0.049332
    12. h 0.409881

    2.2 .iloc()按位置进行选择

    pandas 提供了一套方法来获得纯粹的基于整数的索引。语义紧跟 Python 和 NumPy 切片。这些是0-based索引。切片时,包括起始边界,排除上限。尝试使用非整数,即使是有效标签也会引发IndexError.

    .iloc属性是主要的访问方法。以下是有效输入:

    • 一个整数,例如5

    • 整数列表或数组。[4, 3, 0]

    • 带有 ints 的切片对象1:7

    • 一个布尔数组。

    • callable,请参阅按 Callable 选择

    示例:继上述案例的dataframe

    1. A B C D
    2. a 0.529671 -0.076485 0.379469 1.494926
    3. b -0.082312 -0.328869 0.175183 -0.798430
    4. c 0.681922 0.741320 -0.910726 -2.176608
    5. d 1.500632 -1.165229 0.316722 0.402977
    6. e -2.044217 0.930242 0.433050 0.542472
    7. f 1.332038 0.476599 1.661994 2.102483
    8. g 0.488362 -1.667154 -0.651079 -0.049332
    9. h -0.676308 0.904894 1.592176 0.409881

    1.  基于(行)位置的索引

    1. # 基于(行)位置的索引
    2. df.iloc[0]
    3. #输出结果:
    4. A 0.529671
    5. B -0.076485
    6. C 0.379469
    7. D 1.494926
    8. Name: a, dtype: float64
    9. df.iloc[1]
    10. #输出结果:
    11. A -0.082312
    12. B -0.328869
    13. C 0.175183
    14. D -0.798430
    15. Name: b, dtype: float64

    2. 取出第三行第二列以后的内容

    1. df.iloc[3:,1:]
    2. #输出结果:
    3. B C D
    4. d -1.165229 0.316722 0.402977
    5. e 0.930242 0.433050 0.542472
    6. f 0.476599 1.661994 2.102483
    7. g -1.667154 -0.651079 -0.049332
    8. h 0.904894 1.592176 0.409881

    2.3 使用属性获取数据

    对于上述数据,在pandas中,也可以采用属性获取方式取出数据。

    示例:取出A列和D列的数据

    1. #属性获取,取出A列内容
    2. df.A
    3. #输出结果:
    4. a 1.310455
    5. b -1.015628
    6. c 1.281924
    7. d 0.496812
    8. e -1.733183
    9. f 0.140338
    10. g -0.179063
    11. h -0.642013
    12. Name: A, dtype: float64
    13. df.D
    14. #输出结果:
    15. a -0.298131
    16. b -1.141310
    17. c -0.302760
    18. d 1.188531
    19. e -1.608952
    20. f 0.437460
    21. g -0.696010
    22. h -0.525048
    23. Name: D, dtype: float64

    3.  统计函数

    pandas中提供多种统计函数供用户使用,如百分比变化.pct_change();协方差.cov();相关性.corr();数据排名.rank()方法

    3.1 百分比变化.pct_change()

    SeriesDataFrame有一种方法.pct_change()来计算给定周期数内的百分比变化(在计算百分比变化之前fill_method使用填充 NA/null 值)。

    基本语法:

    1. Series.pct_change()
    2. or
    3. DataFrame.pct_change(periods=行数)

    示例:

    1. import pandas as pd
    2. import numpy as np
    3. #创建基础Series
    4. s = pd.Series([877,865,874,890,912])
    5. s
    6. # 输出结果:
    7. 0 877
    8. 1 865
    9. 2 874
    10. 3 890
    11. 4 912
    12. dtype: int64
    13. #创建基础dataframe
    14. df = pd.DataFrame(np.random.randn(5, 4))
    15. df
    16. #输出结果
    17. 0 1 2 3
    18. 0 0.655875 -2.195588 -0.785019 1.122582
    19. 1 0.852057 -2.276063 1.528201 -0.167119
    20. 2 -1.057979 -0.396548 -0.915528 0.026226
    21. 3 -0.490155 1.803235 0.005851 -1.252117
    22. 4 0.946558 -2.680471 -0.055739 -0.624553

    获取变化的百分比:

    1. # 变化的百分比程度(波动变化)
    2. s.pct_change()
    3. #输出结果:
    4. 0 NaN
    5. 1 -0.013683
    6. 2 0.010405
    7. 3 0.018307
    8. 4 0.024719
    9. dtype: float64
    10. # 变化的百分比程度
    11. df.pct_change(periods=1)
    12. # 输出结果:
    13. 0 1 2 3
    14. 0 NaN NaN NaN NaN
    15. 1 0.299115 0.036653 -2.946706 -1.148870
    16. 2 -2.241677 -0.825775 -1.599088 -1.156933
    17. 3 -0.536707 -5.547331 -1.006391 -48.742482
    18. 4 -2.931143 -2.486479 -10.526903 -0.501202

    3.2 协方差.cov()

    Series.cov()可用于计算系列之间的协方差(不包括缺失值)。

    DataFrame.cov()计算DataFrame 中系列之间的成对协方差,也排除 NA/null 值。

    示例:

    1. #计算两个Series之间的协方差
    2. s1 = pd.Series(np.random.randn(10))
    3. s2 = pd.Series(np.random.randn(10))
    4. #两个数据的协方差
    5. s1.cov(s2)
    6. #输出结果:
    7. -0.0751790891671201
    8. # 计算dataframe中数据的协方差
    9. frame = pd.DataFrame(np.random.randn(1000, 5), columns=["a", "b", "c", "d", "e"])
    10. frame.cov()
    11. #输出结果:
    12. a b c d e
    13. a 1.000882 -0.003177 -0.002698 -0.006889 0.031912
    14. b -0.003177 1.024721 0.000191 0.009212 0.000857
    15. c -0.002698 0.000191 0.950735 -0.031743 -0.005087
    16. d -0.006889 0.009212 -0.031743 1.002983 -0.047952
    17. e 0.031912 0.000857 -0.005087 -0.047952 1.042487

     DataFrame.cov还支持一个可选min_periods关键字,该关键字指定每个列对所需的最小观察次数,以便获得有效结果。例如

    frame.cov(min_periods=12)

    观察dataframe中最少12列数据,若不够12列则返回NaN。

    3.3 相关性.corr()

    可以使用该.coor()方法计算相关性。使用该method参数,提供了几种计算相关性的方法:

    方法名称

    描述

    pearson (default)

    标准相关系数

    kendall

    Kendall Tau 相关系数

    spearman

    Spearman等级相关系数

    示例:

    1. 两个series之间的相关性

    1. s1 = pd.Series(np.random.randn(10))
    2. s2 = s1*2
    3. #相关性(s1与s2)
    4. s1.corr(s2)
    5. #输出结果:
    6. 0.9999999999999999

     2. 三组数据之间的相关性(dataframe)

    1. s1 = pd.Series(np.random.randn(10))
    2. s2 = s1*2
    3. s3 = pd.Series(np.random.randn(10))
    4. df = pd.DataFrame({
    5. 's1':s1,
    6. 's2':s2,
    7. 's3':s3
    8. })
    9. df
    10. # 输出dataframe
    11. s1 s2 s3
    12. 0 -1.149359 -2.298718 0.742016
    13. 1 0.476084 0.952168 -0.375759
    14. 2 -0.998627 -1.997255 0.721653
    15. 3 1.047331 2.094663 -0.078039
    16. 4 0.444710 0.889420 -0.525895
    17. 5 -0.411778 -0.823557 -0.402789
    18. 6 -0.935911 -1.871822 -0.597614
    19. 7 -0.652570 -1.305140 0.636498
    20. 8 1.055361 2.110722 -0.763907
    21. 9 -1.222631 -2.445262 -0.153914
    22. # 三者相关性
    23. df.corr()
    24. #输出结果:
    25. s1 s2 s3
    26. s1 1.000000 1.000000 -0.548589
    27. s2 1.000000 1.000000 -0.548589
    28. s3 -0.548589 -0.548589 1.000000

    3.4 数据排名.rank()

    .rank()方法生成一个数据排名,其中关系被分配了组的排名平均值,例如:

    1. s = pd.Series([877,865,874,890,912])
    2. s
    3. #输出结果:
    4. 0 877
    5. 1 865
    6. 2 874
    7. 3 890
    8. 4 912
    9. dtype: int64
    10. s.rank()
    11. #输出结果:
    12. 0 3.0
    13. 1 1.0
    14. 2 2.0
    15. 3 4.0
    16. 4 5.0
    17. dtype: float64

    在dataframe中,rank()可以对行 ( axis=0) 或列 ( axis=1) 进行排名。NaN值被排除在排名之外。

    rank可选地采用ascending默认为 true 的参数;如果为 false,则对数据进行反向排名,较大的值分配较小的排名。

    rank支持不同的平局方法,由method 参数指定:

    • average: 并列组的平均排名

    • min: 组中排名最低的

    • max: 组内最高排名

    • first:按照它们在数组中出现的顺序分配的排名

    4. 窗口函数

    pandas 包含一组紧凑的 API,用于执行窗口操作 - 一种在值的滑动分区上执行聚合的操作。API 的功能与 API 类似groupbySeriesDataFrame使用必要的参数调用窗口化方法,然后调用聚合函数。

    pandas 支持 4 种类型的窗口操作:

    1. 滚动窗口:值上的通用固定或可变滑动窗口。

    2. 加权窗口:库提供的加权非矩形窗口scipy.signal

    3. 扩展窗口:累积值的窗口。

    4. 指数加权窗口:值的累积和指数加权窗口。

    概念

    方法

    返回的对象

    支持基于时间的窗口

    支持链式groupby

    支持表格法

    支持在线操作

    卷帘窗

    rolling

    Rolling

    是的

    是的

    是>1.3

    加权窗口

    rolling

    Window

    扩大窗口

    expanding

    Expanding

    是的

    是>1.3

    指数加权窗口

    ewm

    ExponentialMovingWindow

    是>1.2

    是(从 1.3 版开始)

     示例:

    1. import pandas as pd
    2. import numpy as np
    3. df = pd.DataFrame(np.random.randn(10,4))
    4. df
    5. #输出结果:
    6. 0 1 2 3
    7. 0 2.599818 0.451315 -0.428038 0.035233
    8. 1 0.395523 -0.098377 0.059649 -0.489922
    9. 2 0.550164 -0.469461 1.193710 0.567562
    10. 3 1.483434 -0.793989 -0.738174 0.515078
    11. 4 0.395409 0.425578 -0.439963 -0.207277
    12. 5 -0.035479 -1.438315 -0.863333 -0.129948
    13. 6 -0.336889 -0.094188 -1.452638 0.083352
    14. 7 -0.626117 0.120990 -0.566740 0.665003
    15. 8 -1.437816 -0.112235 -0.232150 -0.099910
    16. 9 -0.582537 0.388641 1.008226 0.321893

    1. .rolling() 卷帘窗

    1. # 滚动窗口求每三行之间的平均值
    2. df.rolling(window=3).mean()
    3. #输出结果:
    4. 0 1 2 3
    5. 0 NaN NaN NaN NaN
    6. 1 NaN NaN NaN NaN
    7. 2 1.181835 -0.038841 0.275107 0.037625
    8. 3 0.809707 -0.453942 0.171729 0.197573
    9. 4 0.809669 -0.279291 0.005191 0.291788
    10. 5 0.614455 -0.602242 -0.680490 0.059284
    11. 6 0.007681 -0.368975 -0.918644 -0.084624
    12. 7 -0.332828 -0.470504 -0.960904 0.206135
    13. 8 -0.800274 -0.028478 -0.750509 0.216148
    14. 9 -0.882157 0.132465 0.069779 0.295662

     2. .expanding扩大窗口

    1. #expanding
    2. df.expanding(min_periods=3).mean()
    3. #输出结果:
    4. 0 1 2 3
    5. 0 NaN NaN NaN NaN
    6. 1 NaN NaN NaN NaN
    7. 2 1.181835 -0.038841 0.275107 0.037625
    8. 3 1.257235 -0.227628 0.021787 0.156988
    9. 4 1.084869 -0.096987 -0.070563 0.084135
    10. 5 0.898145 -0.320542 -0.202691 0.048455
    11. 6 0.721711 -0.288205 -0.381255 0.053440
    12. 7 0.553233 -0.237056 -0.404441 0.129885
    13. 8 0.332005 -0.223187 -0.385297 0.104352
    14. 9 0.240551 -0.162004 -0.245945 0.126106

  • 相关阅读:
    【名词解释】concolic testing和instrumentation
    实验1: 交换机MAC地址表学习过程实验
    双向控制舵机(树莓派版)
    编程的艺术:不嵌套主义
    链表、队列、栈、递归 复习刷题
    【JavaScript面试】map()方法
    macos 不支持svn安装
    LIO-SAM运行报错[lio_sam_imuPreintegration-2]和[lio_sam_mapOptmization-5]解决
    【Web】标准文档流
    OpenCV学习(四)——轨迹栏(调色板与不同通道图像)
  • 原文地址:https://blog.csdn.net/damadashen/article/details/126901690