python - Pandas 比较和求和两个不同大小的 DataFrame 之间的值
问题描述
假设我有两个不同大小的数据框:
df1 = pd.DataFrame(dict(xlow=np.linspace(0, 10, 11),
xup=np.linspace(1.0, 11, 11)))
df2 = pd.DataFrame(dict(x=np.random.uniform(low=1, high=10, size=(20,)),
volume=np.random.randint(0, 10, size=20)))
我有:
df1:
xlow xup
0 0.0 1.0
1 1.0 2.0
2 2.0 3.0
3 3.0 4.0
4 4.0 5.0
5 5.0 6.0
6 6.0 7.0
7 7.0 8.0
8 8.0 9.0
9 9.0 10.0
10 10.0 11.0
和:
df2:
x volume
0 1.632789 8
1 8.346898 7
2 1.372285 2
3 1.946896 9
4 7.047305 0
5 3.851938 4
6 2.439664 7
7 8.823509 1
8 1.136700 1
9 8.766352 8
10 2.135441 8
11 8.092385 4
12 6.532898 3
13 7.199914 2
14 1.036684 0
15 9.714326 1
16 5.964111 0
17 9.625200 2
18 9.999818 6
19 9.891857 1
现在我想向 df1 添加第三列,比如说 total_volume,它是位于 xlow 的各个行和 df1 的 xup 之间的体积的总和。我可以这样做:
df1['total_volume']=df1.apply(lambda row: df2[(df2.x<=row['xup']) & (df2.x>row['xlow'])].volume.sum(),axis=1)
which results in
xlow xup total_volume
0 0.0 1.0 0
1 1.0 2.0 20
2 2.0 3.0 15
3 3.0 4.0 4
4 4.0 5.0 0
5 5.0 6.0 0
6 6.0 7.0 3
7 7.0 8.0 2
8 8.0 9.0 20
9 9.0 10.0 10
10 10.0 11.0 0
我们可以检查说第二行的值:
df2[(df2.x<=2) & (df2.x>1) ].volume.sum()=20
实际上,我的 df1 最多可以有数十万行,因此可能需要数十分钟才能完成。是否有更矢量化/pythonic 的方式来执行此操作。我尝试过 pandas 合并和加入,但没有成功,很可能是因为我还是个新手。
谢谢你的帮助!
解决方案
df1 的每一行是否具有相同的范围?然后迭代 df2 并简单地添加到 df1。
for d in df2:
df1[d.x//1].total_volume += d.volume
如果不是,则对 df2 进行排序。
推荐阅读
- php - 我正在从我的 sql 数据库中获取数据以及如何从 JSON 数据中删除反斜杠?
- php - Laravel 根据关系选择模型
- javascript - 带有回调的 useState 钩子
- python-3.x - 无法安装 jupyter
- python - 如何在 z3 中为 python 评估这个方程
- r - 使用响应式绘图时出现 R 闪亮错误
- android - Xamarin 形成 LiteDB - 真正的 android 设备问题
- python - 当我们在 python 脚本中导入多个模块时,__name__ 是什么
- arrays - 在 Matlab 中用一个三阶微分方程求解微分方程组时出错。数组的尺寸不一致
- instagram - 图形 API 的 Instagram 访问令牌