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 |
|---|
所有评论(0)