DataFrame的运算
1.DataFrame之间的运算
同Series一样:
在运算中自动对齐不同索引的数据 如果索引不对应,则补NaN
**dataframe和dataframe的运算规则: 对应索引位置的元素进行运算. 这个对应索引位置, 是要求行列索引都相同才行 **
import numpy as np
from pandas import DataFrame
from pandas import Series
data = np. random. randint( 0 , 150 , size= ( 5 , 4 ) )
columns = [ '语文' , '数学' , '英语' , 'python' ]
index = [ '张三' , '李四' , '王五' , '赵六' , '田七' ]
df1 = DataFrame( data= data, index= index, columns= columns)
df1
语文 数学 英语 python 张三 74 12 40 47 李四 121 27 128 87 王五 39 109 126 8 赵六 124 88 86 14 田七 103 96 34 74
data = np. random. randint( 0 , 150 , size= ( 6 , 4 ) )
columns = [ '语文' , '数学' , '英语' , 'python' ]
index = [ '张三' , '李四' , '王五' , '赵六' , '田七' , '孙八' ]
df2 = DataFrame( data= data, index= index, columns= columns)
df2
语文 数学 英语 python 张三 103 50 85 101 李四 100 142 91 49 王五 47 133 36 88 赵六 131 83 79 87 田七 22 57 122 100 孙八 99 50 40 128
( df1 + df2) / 2
语文 数学 英语 python 孙八 NaN NaN NaN NaN 张三 85.0 90.0 98.0 80.0 李四 73.0 126.0 112.0 50.5 王五 35.0 136.0 48.0 89.5 田七 34.5 96.5 61.0 90.5 赵六 87.5 66.0 49.0 109.0
( df1. add( df2, fill_value= 0 ) ) / 2
语文 数学 英语 python 孙八 49.5 25.0 20.0 64.0 张三 85.0 90.0 98.0 80.0 李四 73.0 126.0 112.0 50.5 王五 35.0 136.0 48.0 89.5 田七 34.5 96.5 61.0 90.5 赵六 87.5 66.0 49.0 109.0
df1 + 10
语文 数学 英语 python 张三 77 140 121 69 李四 56 120 143 62 王五 33 149 70 101 赵六 54 59 29 141 田七 57 146 10 91
Python 操作符与pandas操作函数的对应表:
Python Operator Pandas Method(s) +
add()
-
sub()
, subtract()
*
mul()
, multiply()
/
truediv()
, div()
, divide()
//
floordiv()
%
mod()
**
pow()
2.Series与DataFrame之间的运算
【重要】
使用Python操作符:以行为单位操作(参数必须是行),对所有行都有效。(类似于numpy中二维数组与一维数组的运算,但可能出现NaN)
使用pandas操作函数:
axis=0 :以列为单位操作(参数必须是列),对所有列都有效。 axis=1 :以行为单位操作(参数必须是行),对所有行都有效。
df_mean = ( df1. add( df2, fill_value= 0 ) ) / 2
df_mean
语文 数学 英语 python 孙八 49.5 25.0 20.0 64.0 张三 85.0 90.0 98.0 80.0 李四 73.0 126.0 112.0 50.5 王五 35.0 136.0 48.0 89.5 田七 34.5 96.5 61.0 90.5 赵六 87.5 66.0 49.0 109.0
sunba = df_mean. loc[ '孙八' ]
sunba
"""
语文 49.5
数学 25.0
英语 20.0
python 64.0
Name: 孙八, dtype: float64
"""
df_mean + sunba
语文 数学 英语 python 孙八 99.0 50.0 40.0 128.0 张三 134.5 115.0 118.0 144.0 李四 122.5 151.0 132.0 114.5 王五 84.5 161.0 68.0 153.5 田七 84.0 121.5 81.0 154.5 赵六 137.0 91.0 69.0 173.0
s = Series( data= np. random. randint( 0 , 150 , size= ( 6 , ) ) , index= df_mean. index)
s
"""
孙八 105
张三 110
李四 11
王五 56
田七 2
赵六 71
dtype: int32
"""
df_mean + s
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 NaN NaN NaN NaN NaN 赵六 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
df_mean. add( s, axis= 0 )
语文 数学 英语 python 孙八 67.5 43.0 38.0 82.0 张三 86.0 91.0 99.0 81.0 李四 191.0 244.0 230.0 168.5 王五 140.0 241.0 153.0 194.5 田七 116.5 178.5 143.0 172.5 赵六 180.5 159.0 142.0 202.0