Pandas的学习(4.DataFrame之间的运算以及DataFrame和Series之间的运算)

DataFrame的运算

   1.DataFrame之间的运算

     同Series一样:

               ---   在运算中自动对齐不同索引的数据

               ---  如果索引不对应,则补NaN

    无论是行不对应还是列不对应,都会补充NaN值

from pandas import DataFrame
import numpy as np

# 创建连个DataFrame
# df1:成绩表一
df1 = DataFrame(np.random.randint(0, 150, size=(4, 4)),
                index=['张三', '李四', '王五', '小明'],
                columns=['语文', '数学', '英语', 'Python'])
# df2:成绩表二(相对于df1时,多加了一个人)
df2 = DataFrame(np.random.randint(0, 150, size=(5, 4)),
                index=['张三', '李四', '王五', '小明', '小张'],
                columns=['语文', '数学', '英语', 'Python'])
# 两个成绩相加
print(df1 + df2)
"""
       语文     数学     英语  Python
小张    NaN    NaN    NaN     NaN
小明  132.0  129.0  135.0   171.0
张三   13.0   91.0   75.0   127.0
李四  239.0   56.0  242.0    27.0
王五  143.0  124.0  108.0   226.0 
"""
# 使用add() 为了避免加起来有NaN的值 fill_value=True
df3 = df1.add(df2, fill_value=0)
print(df3)
""" # 就没有NaN值了
       语文     数学     英语  Python
小张  129.0  127.0  105.0    62.0
小明  238.0  146.0   81.0    80.0
张三  206.0  114.0  226.0   156.0
李四  167.0  252.0  279.0   180.0
王五  174.0  180.0  159.0   201.0
"""

还有一些其他的运算方法,都有其对应的函数

 2.Series与DataFrame之间的运算

 --- 使用Python操作符:以行为单位操作(参数必须是行),对所有行都有效。(类似于numpy中二维数组与一维数组的运算,但可能出现NaN)

--- 使用pandas操作函数:

          axis=0:以列为单位操作(参数必须是列),对所有列都有效。

          axis=1:以行为单位操作(参数必须是行),对所有列都有效。

#  注意注释部分的解释

# Series 和 DataFrame 之间的运算
df3 = DataFrame(np.random.randint(0, 150, size=(5, 4)),
                index=['张三', '李四', '王五', '小明', '小张'],
                columns=['语文', '数学', '英语', 'Python'])
# 提取一列
s1 = df3['Python']  # 提取后是Series类型,是列数据
print(s1)
"""
张三    128
李四     29
王五    105
小明    147
小张     33
Name: Python, dtype: int32
"""
# 然后使用运算符直接相加
print(df3 + s1)
"""  # 明显是有问题的
    Python  小张  小明  张三  数学  李四  王五  英语  语文
张三     NaN NaN NaN NaN NaN NaN NaN NaN NaN
李四     NaN NaN NaN NaN NaN NaN NaN NaN NaN
王五     NaN NaN NaN NaN NaN NaN NaN NaN NaN
小明     NaN NaN NaN NaN NaN NaN NaN NaN NaN
小张     NaN NaN NaN NaN NaN NaN NaN NaN NaN
"""

'''loc的用法,取出一行的数据'''
s2 = df3.loc['小明']
print(s2)
"""
语文        120
数学         96
英语        101
Python     30
Name: 小明, dtype: int32
"""

'''
    直接加的,会有类似于广播机制的问题,就是说,
    取出来的这样一行,给df3的每行都会加
'''
print(df3 + s2)
"""
     语文   数学   英语  Python
张三  258  168  154      76
李四  219  184  221     179
王五  163  122  142     179
小明  240  192  202      60
小张  174  181  132     173
"""


'''想要避免NaN值,使用pandas提供的函数'''
df4 = DataFrame(np.random.randint(0, 150, size=(5, 4)),
                index=['张三', '李四', '王五', '小明', '小张'],
                columns=['语文', '数学', '英语', 'Python'])
print(df4)
"""
    语文   数学   英语  Python
张三  49   69   19      77
李四   0   37   64      70
王五  39   11  108      34
小明  53   18  121       0
小张  20  113   37     127
"""
s3 = df4.Python  # 取出列
# axis=0 以列为单位操作,取出的什么就以什么为单位
# 把取出来的数据给df的每列进行相加
print(df4.add(s3, axis=0))
"""
     语文   数学   英语  Python
张三  126  146   96     154
李四   70  107  134     140
王五   73   45  142      68
小明   53   18  121       0
小张  147  240  164     254
"""
s4 = df4.loc['小明']  # 取出行
# axis=1 以行为单位操作,取出的什么就以什么为单位
# 把取出来的数据给df的每行进行相加
print(df4.add(s4, axis=1))
"""
     语文   数学   英语  Python
张三  102   87  140      77
李四   53   55  185      70
王五   92   29  229      34
小明  106   36  242       0
小张   73  131  158     127
"""
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是那个同伟伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值