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