• 丢弃Excel,Pandas一行搞定


    之前介绍了pandas的多条件筛选,这些都是一些数据处理的必要技能,也不贪多,咱们每次学习一点。

    这次咱们说说pandas的两个表的连接技能merge,也就是根据一个表的条件去匹配另一个表的内容。

    话不多说,直接正文。

    准备数据

    先导入模块

    1. import pandas as pd
    2. df1 = pd.DataFrame({
    3.     '姓名': ['张三''李四''王五''刘六''齐四'],
    4.     '号码': ['123''456''789''987''654']
    5. })
    6. df2 = pd.DataFrame({
    7.     '姓名': ['张三''张三''张三''李四''李四''李四''李四''王五''王五''刘玉''胡军''刘玉''刘六''刘六''刘六''刘六''刘克''刘玉''齐七''齐七''齐七''齐七''冯亮''刘玉''王云'],
    8.     '号码': ['123''123''123''123''123''456''456''456''456''456''741''741''741''741''741''789''789''789''789''789''852''852''852''852''852'],
    9.     '日期': ['2022-03-13''2022-03-06''2022-01-30''2022-01-04''2022-02-26''2022-03-26''2022-03-06''2022-01-30''2022-01-29''2022-03-13''2022-03-06''2022-02-19''2022-02-04''2022-03-10''2022-04-19''2022-03-10''2022-01-29''2022-02-19''2022-03-06''2022-03-26''2022-01-04''2022-02-04''2022-04-19''2022-02-26''2022-03-06'],
    10.     '方案': ['G1012''G1022''G1002''G1007''G1017''G1023''G1018''G1003''G1008''G1013''G1020''G1015''G1010''G1005''G1025''G1004''G1009''G1014''G1019''G1024''G1006''G1011''G1026''G1016''G1021']
    11. })

    输出内容:

    df1内容

    1. 姓名 号码
    2. 0 张三 123
    3. 1 李四 456
    4. 2 王五 789
    5. 3 刘六 987
    6. 4 齐四 654

    df2内容:

    1. 姓名 号码 日期 方案
    2. 0 张三 123 2022-03-13 G1012
    3. 1 张三 123 2022-03-06 G1022
    4. 2 张三 123 2022-01-30 G1002
    5. 3 李四 123 2022-01-04 G1007
    6. 4 李四 123 2022-02-26 G1017
    7. 5 李四 456 2022-03-26 G1023
    8. 6 李四 456 2022-03-06 G1018
    9. 7 王五 456 2022-01-30 G1003
    10. 8 王五 456 2022-01-29 G1008
    11. 9 刘玉 456 2022-03-13 G1013
    12. 10 胡军 741 2022-03-06 G1020
    13. 11 刘玉 741 2022-02-19 G1015
    14. 12 刘六 741 2022-02-04 G1010
    15. 13 刘六 741 2022-03-10 G1005
    16. 14 刘六 741 2022-04-19 G1025
    17. 15 刘六 789 2022-03-10 G1004
    18. 16 刘克 789 2022-01-29 G1009
    19. 17 刘玉 789 2022-02-19 G1014
    20. 18 齐七 789 2022-03-06 G1019
    21. 19 齐七 789 2022-03-26 G1024
    22. 20 齐七 852 2022-01-04 G1006
    23. 21 齐七 852 2022-02-04 G1011
    24. 22 冯亮 852 2022-04-19 G1026
    25. 23 刘玉 852 2022-02-26 G1016
    26. 24 王云 852 2022-03-06 G1021

    连接

    函数说明:pd.merge(left=df1(需要匹配的原始表), right=df2(被匹配的数据表), on="姓名"(需要匹配的条件列), how="inner"(连接方式))

    内连接

    how默认为inner内连接查询特点是df1有匹配的才显示,不匹配的不显示

    df = pd.merge(left=df1right=df2on="姓名", how="inner")
    

    输出:

    1. 姓名 号码_x 号码_y 日期 方案
    2. 0 张三 123 123 2022-03-13 G1012
    3. 1 张三 123 123 2022-03-06 G1022
    4. 2 张三 123 123 2022-01-30 G1002
    5. 3 李四 456 123 2022-01-04 G1007
    6. 4 李四 456 123 2022-02-26 G1017
    7. 5 李四 456 456 2022-03-26 G1023
    8. 6 李四 456 456 2022-03-06 G1018
    9. 7 王五 789 456 2022-01-30 G1003
    10. 8 王五 789 456 2022-01-29 G1008
    11. 9 刘六 987 741 2022-02-04 G1010
    12. 10 刘六 987 741 2022-03-10 G1005
    13. 11 刘六 987 741 2022-04-19 G1025
    14. 12 刘六 987 789 2022-03-10 G1004

    df1表里需要匹配的姓名里,在df2里面能匹配上姓名的都会列出来,而匹配不上的,都不会列出来,包括df1里面的内容

    小提示:如果两表有相同列名的,会自动在列名后面加_x,_y来区分

    外连接

    how="outer"为外连接:查询特点是无论匹不匹配都显示,对应的值没有则显示空

    df = pd.merge(left=df1right=df2on="姓名", how="outer")
    

    输出:

    1. 姓名 号码_x 号码_y 日期 方案
    2. 0 张三 123 123 2022-03-13 G1012
    3. 1 张三 123 123 2022-03-06 G1022
    4. 2 张三 123 123 2022-01-30 G1002
    5. 3 李四 456 123 2022-01-04 G1007
    6. 4 李四 456 123 2022-02-26 G1017
    7. 5 李四 456 456 2022-03-26 G1023
    8. 6 李四 456 456 2022-03-06 G1018
    9. 7 王五 789 456 2022-01-30 G1003
    10. 8 王五 789 456 2022-01-29 G1008
    11. 9 刘六 987 741 2022-02-04 G1010
    12. 10 刘六 987 741 2022-03-10 G1005
    13. 11 刘六 987 741 2022-04-19 G1025
    14. 12 刘六 987 789 2022-03-10 G1004
    15. 13 齐四 654 NaN NaN NaN
    16. 14 刘玉 NaN 456 2022-03-13 G1013
    17. 15 刘玉 NaN 741 2022-02-19 G1015
    18. 16 刘玉 NaN 789 2022-02-19 G1014
    19. 17 刘玉 NaN 852 2022-02-26 G1016
    20. 18 胡军 NaN 741 2022-03-06 G1020
    21. 19 刘克 NaN 789 2022-01-29 G1009
    22. 20 齐七 NaN 789 2022-03-06 G1019
    23. 21 齐七 NaN 789 2022-03-26 G1024
    24. 22 齐七 NaN 852 2022-01-04 G1006
    25. 23 齐七 NaN 852 2022-02-04 G1011
    26. 24 冯亮 NaN 852 2022-04-19 G1026
    27. 25 王云 NaN 852 2022-03-06 G1021

    df1表里索引13里的齐四无匹配,是空值,而在df2里面的内容都会列出来,和df1匹配不上的其它列的内容也是空值

    注意:这有点互相匹配的意思哟

    左连接

    how="left"为左连接:查询表示左边的值全部显示,如右边无匹配则显示空。但是右边有的值匹配不了左边则不显示

    df = pd.merge(left=df1right=df2on="姓名", how="outer")
    

    输出:

    1. 姓名 号码_x 号码_y 日期 方案
    2. 0 张三 123 123 2022-03-13 G1012
    3. 1 张三 123 123 2022-03-06 G1022
    4. 2 张三 123 123 2022-01-30 G1002
    5. 3 李四 456 123 2022-01-04 G1007
    6. 4 李四 456 123 2022-02-26 G1017
    7. 5 李四 456 456 2022-03-26 G1023
    8. 6 李四 456 456 2022-03-06 G1018
    9. 7 王五 789 456 2022-01-30 G1003
    10. 8 王五 789 456 2022-01-29 G1008
    11. 9 刘六 987 741 2022-02-04 G1010
    12. 10 刘六 987 741 2022-03-10 G1005
    13. 11 刘六 987 741 2022-04-19 G1025
    14. 12 刘六 987 789 2022-03-10 G1004
    15. 13 齐四 654 NaN NaN NaN

    df1表里索引13里的齐四还是无匹配,是空值,而在df2里面的内容就不会列出来了

    右连接

    how="right"为右连接:与左连接相反

    df = pd.merge(left=df1right=df2on="姓名", how="right")
    

    输出:

    1. 姓名 号码_x 号码_y 日期 方案
    2. 0 张三 123 123 2022-03-13 G1012
    3. 1 张三 123 123 2022-03-06 G1022
    4. 2 张三 123 123 2022-01-30 G1002
    5. 3 李四 456 123 2022-01-04 G1007
    6. 4 李四 456 123 2022-02-26 G1017
    7. 5 李四 456 456 2022-03-26 G1023
    8. 6 李四 456 456 2022-03-06 G1018
    9. 7 王五 789 456 2022-01-30 G1003
    10. 8 王五 789 456 2022-01-29 G1008
    11. 9 刘玉 NaN 456 2022-03-13 G1013
    12. 10 胡军 NaN 741 2022-03-06 G1020
    13. 11 刘玉 NaN 741 2022-02-19 G1015
    14. 12 刘六 987 741 2022-02-04 G1010
    15. 13 刘六 987 741 2022-03-10 G1005
    16. 14 刘六 987 741 2022-04-19 G1025
    17. 15 刘六 987 789 2022-03-10 G1004
    18. 16 刘克 NaN 789 2022-01-29 G1009
    19. 17 刘玉 NaN 789 2022-02-19 G1014
    20. 18 齐七 NaN 789 2022-03-06 G1019
    21. 19 齐七 NaN 789 2022-03-26 G1024
    22. 20 齐七 NaN 852 2022-01-04 G1006
    23. 21 齐七 NaN 852 2022-02-04 G1011
    24. 22 冯亮 NaN 852 2022-04-19 G1026
    25. 23 刘玉 NaN 852 2022-02-26 G1016
    26. 24 王云 NaN 852 2022-03-06 G1021

    右连接正好与左连接相反,df1里面匹配不上的不显示,df2里面的内容全都出来了,匹配不上df1的其它列值则为空值

    PS这完全是反向匹配呀

    总结

    大家可以根据需要来选择要连接的方式。好啦,今天的内容就到这了,咱们下期见!

    【python学习】
    学Python的伙伴,欢迎加入新的交流【君羊】:757753272
    一起探讨编程知识,成为大神,群里还有软件安装包,实战案例、学习资料

  • 相关阅读:
    Java中 this 和 super 的用法与区别
    牛客多校第三场补题记录
    LeetCo
    【从零开始学习 SystemVerilog】6.4、SystemVerilog 接口—— Interface Modport
    倍福TwinCAT3.0软件与C++通讯问题(EAP通讯)
    Spring Boot中如何实现bean加载
    MSG | 开源与结缘,昇思携梦前行!
    html网页设计大学生作业成品——公益校园网站设计与实现(HTML+CSS+JavaScript)
    Spring核心——SPEL Bean定义中的表达式、实例应用
    为啥强烈禁止使用Calendar?
  • 原文地址:https://blog.csdn.net/weixin_56659172/article/details/126724431