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
"""

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

Pandas的学习(4.DataFrame之间的运算以及DataFrame和Series之间的运算)_第1张图片

 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
"""

你可能感兴趣的:(pandas)