首页 > 解决方案 > 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 合并和加入,但没有成功,很可能是因为我还是个新手。

谢谢你的帮助!

标签: pythonpandasdataframe

解决方案


df1 的每一行是否具有相同的范围?然后迭代 df2 并简单地添加到 df1。

for d in df2:
    df1[d.x//1].total_volume += d.volume

如果不是,则对 df2 进行排序。


推荐阅读