• Pandas-04(缺失数据、分组、合并连接、级联)


    目录

    1.缺失数据

    1.1 isnull()和notnull()检测缺失数据

    1.2 fillna()填充缺失值

    1.3 删除NaN的行 

    1.4 replace()替换丢失的值或者通用值

    2. 分组 

    2.1 groupby()分组

    2.2 get_group()选择组

    3.合并连接merge()

    3.1  示例

    3.2  merge()合并

    3.3  合并模式

    4.级联concat()


    1.缺失数据

    由于数据有多种形式和形式,pandas 旨在灵活处理缺失数据。虽然NaN出于计算速度和方便的原因,它是默认的缺失值标记,但我们需要能够使用不同类型的数据轻松检测该值:浮点、整数、布尔值和一般对象。然而,在许多情况下,PythonNone会出现,我们也希望考虑“缺失”或“不可用”或“NA”。

    1.1 isnull()和notnull()检测缺失数据

    为了更容易检测缺失值(以及跨不同的数组 dtype),pandas 提供了isnull()和notnull()函数,它们也是 Series 和 DataFrame 对象的方法:

    1. isnull()

    示例:

    1. import pandas as pd
    2. import numpy as np
    3. df = pd.DataFrame(np.random.randn(5,3),index=['a','c','e','f','h'],columns=['one','two','three'])
    4. df = df.reindex(['a','b','c','d','e','f','h'])
    5. df
    6. # 输出结果:
    7. one two three
    8. a -0.864969 0.299120 -0.936382
    9. b NaN NaN NaN
    10. c 1.573142 -2.359139 0.118325
    11. d NaN NaN NaN
    12. e 1.070140 -0.392129 -0.647714
    13. f -0.886120 -0.926900 1.170801
    14. h 0.725739 1.182897 -0.899262
    1. #检查缺失数据
    2. df[df['one'].isnull()]
    3. # 输出结果:
    4. one two three
    5. b NaN NaN NaN
    6. d NaN NaN NaN

    2. notnull()

    1. #检查是不是非空的
    2. df['one'].notnull()
    3. # 输出结果:
    4. a True
    5. b False
    6. c True
    7. d False
    8. e True
    9. f True
    10. h True
    11. Name: one, dtype: bool

    输出非空结果:

    1. df[df['one'].notnull()]
    2. # 输出结果:
    3. one two three
    4. a -0.864969 0.299120 -0.936382
    5. c 1.573142 -2.359139 0.118325
    6. e 1.070140 -0.392129 -0.647714
    7. f -0.886120 -0.926900 1.170801
    8. h 0.725739 1.182897 -0.899262

    1.2 fillna()填充缺失值

    finall()可以通过几种方式用非 NA 数据“填充”NA 值。

    1.将NA值替换为标量值

    指定列内容[colomns]填充content:

    df["colomns"].fillna("content")

    2.向前或向后填补空白

    可以指定method的方法pad向前填充值或使用bfill向后填充值:

    df.fillna(method="pad")

    3. 限制填充量

    当只想连续填充一定数量的数据点,可以使用limit关键字:

    df.fillna(method="pad", limit=1)

    4.示例:

    1. # df数据
    2. one two three
    3. a -0.864969 0.299120 -0.936382
    4. b NaN NaN NaN
    5. c 1.573142 -2.359139 0.118325
    6. d NaN NaN NaN
    7. e 1.070140 -0.392129 -0.647714
    8. f -0.886120 -0.926900 1.170801
    9. h 0.725739 1.182897 -0.899262
    1. #可以填充我们想要的数据
    2. df.fillna(df.mean())
    3. #输出结果:
    4. one two three
    5. a -0.864969 0.299120 -0.936382
    6. b 0.323586 -0.439230 -0.238846
    7. c 1.573142 -2.359139 0.118325
    8. d 0.323586 -0.439230 -0.238846
    9. e 1.070140 -0.392129 -0.647714
    10. f -0.886120 -0.926900 1.170801
    11. h 0.725739 1.182897 -0.899262
    12. #将前面的数据填充进来
    13. df.fillna(method='pad')
    14. #输出结果:
    15. one two three
    16. a -0.864969 0.299120 -0.936382
    17. b -0.864969 0.299120 -0.936382
    18. c 1.573142 -2.359139 0.118325
    19. d 1.573142 -2.359139 0.118325
    20. e 1.070140 -0.392129 -0.647714
    21. f -0.886120 -0.926900 1.170801
    22. h 0.725739 1.182897 -0.899262
    23. #将后面的数据填充进来
    24. df.fillna(method='backfill')
    25. #输出结果 :
    26. one two three
    27. a -0.864969 0.299120 -0.936382
    28. b 1.573142 -2.359139 0.118325
    29. c 1.573142 -2.359139 0.118325
    30. d 1.070140 -0.392129 -0.647714
    31. e 1.070140 -0.392129 -0.647714
    32. f -0.886120 -0.926900 1.170801
    33. h 0.725739 1.182897 -0.899262

      1.3 删除NaN的行 

    df.dropna() #删除有NAN的行

    示例:

    1. #删除有NAN的行
    2. df.dropna()
    3. #输出结果:
    4. one two three
    5. a -0.864969 0.299120 -0.936382
    6. c 1.573142 -2.359139 0.118325
    7. e 1.070140 -0.392129 -0.647714
    8. f -0.886120 -0.926900 1.170801
    9. h 0.725739 1.182897 -0.899262

     1.4 replace()替换丢失的值或者通用值

    replace({nan:替换值})

    示例:

    1. df.replace({np.nan:10})
    2. # 输出结果:
    3. one two three
    4. a -0.864969 0.299120 -0.936382
    5. b 10.000000 10.000000 10.000000
    6. c 1.573142 -2.359139 0.118325
    7. d 10.000000 10.000000 10.000000
    8. e 1.070140 -0.392129 -0.647714
    9. f -0.886120 -0.926900 1.170801
    10. h 0.725739 1.182897 -0.899262
    11. df['four']=pd.Series([1,2,3,4,5,6,7],index=['a','b','c','d','e','f','h'])
    12. df
    13. #输出结果:
    14. one two three four
    15. a -0.864969 0.299120 -0.936382 1
    16. b NaN NaN NaN 2
    17. c 1.573142 -2.359139 0.118325 3
    18. d NaN NaN NaN 4
    19. e 1.070140 -0.392129 -0.647714 5
    20. f -0.886120 -0.926900 1.170801 6
    21. h 0.725739 1.182897 -0.899262 7
    22. #替换NaN为1051000
    23. df.replace({np.nan:10,5:1000})
    24. #输出结果:
    25. one two three four
    26. a -0.864969 0.299120 -0.936382 1
    27. b 10.000000 10.000000 10.000000 2
    28. c 1.573142 -2.359139 0.118325 3
    29. d 10.000000 10.000000 10.000000 4
    30. e 1.070140 -0.392129 -0.647714 1000
    31. f -0.886120 -0.926900 1.170801 6
    32. h 0.725739 1.182897 -0.899262 7

     

    2. 分组 

    pandas 对象可以在它们的任何轴上分割。分组的抽象定义是提供标签到组名的映射。

    “分组依据”是指涉及以下一个或多个步骤的过程:

    • 根据某些标准将数据分组。

    • 独立地对每个组应用一个函数。

    • 结果组合成一个数据结构。

    其中,拆分步骤是最直接的。事实上,在许多情况下,我们可能希望将数据集分成组,并对这些组做一些事情。

    2.1 groupby()分组

    示例:

    1. import pandas as pd
    2. import numpy as np
    3. df = pd.DataFrame({
    4. 'user':['小明',"小黑",'小黄','小李'],
    5. 'gender':['男','女','女','男'],
    6. 'score':[99,95,70,88]
    7. })
    8. df
    9. #输出结果:
    10. user gender score
    11. 0 小明 男 99
    12. 1 小黑 女 95
    13. 2 小黄 女 70
    14. 3 小李 男 88

    1.进行分组

    1. #分组对象
    2. df.groupby('gender')
    3. #输出结果:
    4. <pandas.core.groupby.groupby.DataFrameGroupBy object at 0x000001FA94C1A400>

     2.获取分组情况

    1. df.groupby('gender').groups#获取分组情况
    2. #输出结果:
    3. {'女': Int64Index([1, 2], dtype='int64'),
    4. '男': Int64Index([0, 3], dtype='int64')}

    3. 循环迭代组

    1. #循环迭代组
    2. grouped = df.groupby('gender')
    3. for name,group in grouped:
    4. print(name)
    5. print(group)
    6. #输出结果:
    7. user gender score
    8. 1 小黑 女 95
    9. 2 小黄 女 70
    10. user gender score
    11. 0 小明 男 99
    12. 3 小李 男 88

    2.2 get_group()选择组

    1. get_group()基础使用

    1. #选择组
    2. grouped.get_group('男')
    3. #输出结果:
    4. user gender score
    5. 0 小明 男 99
    6. 3 小李 男 88
    7. #选择组,聚合计算
    8. grouped.get_group('男')['score'].agg(np.mean)
    9. grouped.get_group('女')['score'].agg(np.max)
    10. #输出结果:
    11. 93.5
    12. 95
    13. #获取分组里的长度()
    14. grouped.get_group('女').agg(np.size)
    15. #输出结果:
    16. user 2
    17. gender 2
    18. score 2
    19. dtype: int64

     2.分组聚合

    1. df['star'] = pd.Series([5,7,4,3])
    2. df
    3. #输出结果:
    4. user gender score star
    5. 0 小明 男 99 5
    6. 1 小黑 女 95 7
    7. 2 小黄 女 70 4
    8. 3 小李 男 88 3
    9. grouped = df.groupby('gender')
    10. #求男女平均分及星数总和
    11. grouped[['score','star']].agg({'score':np.mean,'star':np.sum})
    12. #输出结果:
    13. score star
    14. gender
    15. 82.5 11
    16. 93.5 8
    17. #分组中平均分大于90
    18. df.groupby('gender').filter(lambda x:x['score'].mean()>90)
    19. #输出结果:
    20. user gender score star
    21. 0 小明 男 99 5
    22. 3 小李 男 88 3

    3.合并连接merge()

    在pandas中,可以使用merge()对多个数据进行合并,基础语法如下:

    pd.merge(df1,df2...,on='合并索引值')

    3.1 示例

    1. import pandas as pd
    2. import numpy as np
    3. yuwen = pd.DataFrame({
    4. 'id':[1,2,3,4,5,7],
    5. 'name':["小明","小敏","小红","小黑","小王",'老陈'],
    6. 'yuwenScore':[98,77,45,87,66,99]
    7. })
    8. shuxue = pd.DataFrame({
    9. 'id':[1,2,3,4,5,6],
    10. 'name':["小明","小敏","小红","小黑","小王","老李"],
    11. 'shuxueScore':[79,56,88,92,68,88]
    12. })
    13. # 输出结果
    14. id name yuwenScore
    15. 0 1 小明 98
    16. 1 2 小敏 77
    17. 2 3 小红 45
    18. 3 4 小黑 87
    19. 4 5 小王 66
    20. 5 7 老陈 99
    21. id name shuxueScore
    22. 0 1 小明 79
    23. 1 2 小敏 56
    24. 2 3 小红 88
    25. 3 4 小黑 92
    26. 4 5 小王 68
    27. 5 6 老李 88

    3.2  merge()合并

    1. pd.merge(yuwen,shuxue,on='id')#通过id这个健合并
    2. #输出结果:
    3. id name_x yuwenScore name_y shuxueScore
    4. 0 1 小明 98 小明 79
    5. 1 2 小敏 77 小敏 56
    6. 2 3 小红 45 小红 88
    7. 3 4 小黑 87 小黑 92
    8. 4 5 小王 66 小王 68
    9. pd.merge(yuwen,shuxue,on=['id','name'])
    10. # 输出结果:
    11. id name yuwenScore shuxueScore
    12. 0 1 小明 98 79
    13. 1 2 小敏 77 56
    14. 2 3 小红 45 88
    15. 3 4 小黑 87 92
    16. 4 5 小王 66 68

     3. 3 合并模式

    merge()提供how设置合并的方式,inner为键的交集,left为使用左边的键,right为使用右边的键,ourter健的联合。

    示例:

    1. #默认是inner合并模式
    2. pd.merge(yuwen,shuxue,on=['id','name'],how='inner')
    3. # 输出结果
    4. id name yuwenScore shuxueScore
    5. 0 1 小明 98 79
    6. 1 2 小敏 77 56
    7. 2 3 小红 45 88
    8. 3 4 小黑 87 92
    9. 4 5 小王 66 68
    10. pd.merge(yuwen,shuxue,on=['id','name'],how='right')
    11. #输出结果
    12. id name yuwenScore shuxueScore
    13. 0 1 小明 98.0 79
    14. 1 2 小敏 77.0 56
    15. 2 3 小红 45.0 88
    16. 3 4 小黑 87.0 92
    17. 4 5 小王 66.0 68
    18. 5 6 老李 NaN 88
    19. pd.merge(yuwen,shuxue,on=['id','name'],how='outer')
    20. #输出结果
    21. id name yuwenScore shuxueScore
    22. 0 1 小明 98.0 79.0
    23. 1 2 小敏 77.0 56.0
    24. 2 3 小红 45.0 88.0
    25. 3 4 小黑 87.0 92.0
    26. 4 5 小王 66.0 68.0
    27. 5 7 老陈 99.0 NaN
    28. 6 6 老李 NaN 88.0
    29. pd.merge(yuwen,shuxue,on=['id','name'],how='left')
    30. #输出结果
    31. id name yuwenScore shuxueScore
    32. 0 1 小明 98 79.0
    33. 1 2 小敏 77 56.0
    34. 2 3 小红 45 88.0
    35. 3 4 小黑 87 92.0
    36. 4 5 小王 66 68.0
    37. 5 7 老陈 99 NaN

    4.级联concat()

    concat()函数(在 pandas 主命名空间中)完成了沿轴执行连接操作的所有繁重工作,同时在其他轴上执行索引(如果有)的可选设置逻辑(联合或交集)。

    基础语法:

    1. pd.concat(
    2. objs,
    3. axis=0,
    4. join="outer",
    5. ignore_index=False,
    6. keys=None,
    7. levels=None,
    8. names=None,
    9. verify_integrity=False,
    10. copy=True,
    11. )
    • objs: Series 或 DataFrame 对象的序列或映射。如果传递了 dict,则排序后的键将用作keys参数,除非传递,在这种情况下将选择值(见下文)。任何 None 对象都将被静默删除,除非它们都是 None 在这种情况下将引发 ValueError 。

    • axis: {0, 1, ...},默认 0。要连接的轴。

    • join: {'inner', 'outer'},默认为'outer'。如何处理其他轴上的索引。外部用于联合,内部用于交叉。

    • ignore_index:布尔值,默认为 False。如果为 True,则不要使用连接轴上的索引值。结果轴将标记为 0, ..., n - 1。如果您要连接对象,而连接轴没有有意义的索引信息,这将非常有用。请注意,连接中仍然尊重其他轴上的索引值。

    • keys:序列,默认无。使用传递的键作为最外层构建层次索引。如果通过了多个级别,则应包含元组。

    • levels:序列列表,默认无。用于构造 MultiIndex 的特定级别(唯一值)。否则,它们将从密钥中推断出来。

    • names:列表,默认无。生成的分层索引中的级别名称。

    • verify_integrity:布尔值,默认为 False。检查新的连接轴是否包含重复项。相对于实际的数据连接,这可能非常昂贵。

    • copy:布尔值,默认为真。如果为 False,则不要不必要地复制数据。

     示例:

    1. import numpy as np
    2. import pandas as pd
    3. one = pd.DataFrame({
    4. 'name':["alex",'xm','xh','lc','ll'],
    5. 'subject':['python','java','go','js','html'],
    6. 'socre':[88,79,68,96,66]
    7. })
    8. two = pd.DataFrame({
    9. 'name':["xc",'xm','xh','lc','ll'],
    10. 'subject':['php','java','go','js','html'],
    11. 'socre':[89,79,68,96,66]
    12. })
    13. # 输出结果
    14. name subject socre
    15. 0 alex python 88
    16. 1 xm java 79
    17. 2 xh go 68
    18. 3 lc js 96
    19. 4 ll html 66
    20. name subject socre
    21. 0 xc php 89
    22. 1 xm java 79
    23. 2 xh go 68
    24. 3 lc js 96
    25. 4 ll html 66

    忽视索引值合并:

    1. pd.concat([one,two],ignore_index=True)
    2. # 输出结果
    3. name subject socre
    4. 0 alex python 88
    5. 1 xm java 79
    6. 2 xh go 68
    7. 3 lc js 96
    8. 4 ll html 66
    9. 5 xc php 89
    10. 6 xm java 79
    11. 7 xh go 68
    12. 8 lc js 96
    13. 9 ll html 66

     按照列进行合并

    1. #按照列进行合并
    2. pd.concat([one,two],ignore_index=True,axis=1)
    3. #输出结果
    4. 0 1 2 3 4 5
    5. 0 alex python 88 xc php 89
    6. 1 xm java 79 xm java 79
    7. 2 xh go 68 xh go 68
    8. 3 lc js 96 lc js 96
    9. 4 ll html 66 ll html 66

  • 相关阅读:
    Qwen 通义千问 14B 模型,长文本问答效果测试
    Nginx部署前后端分离项目(Linux)
    Config配置刷新
    10.12作业
    E. Block Sequence-Codeforces Round 903 (Div. 3)
    使用 Docker + Jenkins + Gitlab + Maven 自动化部署 Spring Boot
    【杂项学习】Open3D的基本使用
    C Primer Plus(6) 中文版 第5章 运算符、表达式和语句 5.4 表达式和语句
    【源码系列#05】Vue3响应式原理(Ref)
    1小时拿下 Nginx - 3. Nginx 配置文件详解
  • 原文地址:https://blog.csdn.net/damadashen/article/details/126904544