Pandas数据结构:DataFrame学习笔记全解析(二)

本文详细介绍了Pandas库中DataFrame对象的运算规则,包括同Index对齐的自动填充NaN、DataFrame与DataFrame的运算、与Series的混合操作,以及Python操作符与Pandas方法的对应。重点展示了如何处理缺失值和调整操作方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DataFrame的运算

1.DataFrame之间的运算

同Series一样:

  • 在运算中自动对齐不同索引的数据
  • 如果索引不对应,则补NaN

**dataframe和dataframe的运算规则: 对应索引位置的元素进行运算. 这个对应索引位置, 是要求行列索引都相同才行 **

import numpy as np
from pandas import DataFrame
from pandas import Series

# df1 第一次考试:不同人员的各科目成绩
data = np.random.randint(0, 150, size=(5, 4))
columns = ['语文', '数学', '英语', 'python']
index = ['张三', '李四', '王五', '赵六', '田七']
df1 = DataFrame(data=data, index=index, columns=columns)
df1
语文数学英语python
张三74124047
李四1212712887
王五391091268
赵六124888614
田七103963474
# df2 第二次考试:不同人员的各科目成绩 有新学生转入
data = np.random.randint(0, 150, size=(6, 4))
columns = ['语文', '数学', '英语', 'python']
index = ['张三', '李四', '王五', '赵六', '田七', '孙八']
df2 = DataFrame(data=data, index=index, columns=columns)
df2
语文数学英语python
张三1035085101
李四1001429149
王五471333688
赵六131837987
田七2257122100
孙八995040128
# 计算两次月考的平均成绩
(df1 + df2) / 2 # 可以看到孙八在df1中没有,所以都返回nan
语文数学英语python
孙八NaNNaNNaNNaN
张三85.090.098.080.0
李四73.0126.0112.050.5
王五35.0136.048.089.5
田七34.596.561.090.5
赵六87.566.049.0109.0
# 消除nan的影响,使用0代替
(df1.add(df2, fill_value=0)) / 2
语文数学英语python
孙八49.525.020.064.0
张三85.090.098.080.0
李四73.0126.0112.050.5
王五35.0136.048.089.5
田七34.596.561.090.5
赵六87.566.049.0109.0
# dataframe和单个数字运算. 每个元素和这个数字进行运算
df1 + 10
语文数学英语python
张三7714012169
李四5612014362
王五3314970101
赵六545929141
田七571461091

Python 操作符与pandas操作函数的对应表:

Python OperatorPandas 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.525.020.064.0
张三85.090.098.080.0
李四73.0126.0112.050.5
王五35.0136.048.089.5
田七34.596.561.090.5
赵六87.566.049.0109.0
# 修复孙八的成绩
# 拿到孙八平均后的成绩, 加到现在的孙八成绩上面
sunba = df_mean.loc['孙八']
sunba # 拿孙八平均后的成绩 (Seres类型)
"""
语文        49.5
数学        25.0
英语        20.0
python    64.0
Name: 孙八, dtype: float64
"""

df_mean + sunba
语文数学英语python
孙八99.050.040.0128.0
张三134.5115.0118.0144.0
李四122.5151.0132.0114.5
王五84.5161.068.0153.5
田七84.0121.581.0154.5
赵六137.091.069.0173.0
s = Series(data=np.random.randint(0, 150, size=(6,)), index=df_mean.index)
s
"""
孙八    105
张三    110
李四     11
王五     56
田七      2
赵六     71
dtype: int32
"""
# 默认dataframe和series是按照dataframe的columns来操作. 
# 如果要修改操作方向, 那么要通过pandas提供的运算函数
df_mean + s
python孙八张三数学李四王五田七英语语文赵六
孙八NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
张三NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
李四NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
王五NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
田七NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
赵六NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
# 默认axis=1
df_mean.add(s, axis=0)
语文数学英语python
孙八67.543.038.082.0
张三86.091.099.081.0
李四191.0244.0230.0168.5
王五140.0241.0153.0194.5
田七116.5178.5143.0172.5
赵六180.5159.0142.0202.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值