gpt4 book ai didi

python - 如何根据 Pandas 中的匹配列减去行?

转载 作者:太空宇宙 更新时间:2023-11-03 12:44:23 25 4
gpt4 key购买 nike

如果我有两个数据框,就像创建示例中的这些:

df1 = pd.DataFrame({'A': randint(1,11,10), 'B': randint(10,100,10), 'C': randint(100,1000,10)})
df2 = pd.DataFrame({'A': randint(1,11,10), 'B': randint(10,100,10), 'C': randint(100,1000,10)})
df2 = df2.drop_duplicates(subset=['A'])

df1

    A   B   C
0 2 96 826
1 1 64 601
2 1 27 343
3 5 65 600
4 10 68 658
5 6 81 895
6 5 73 440
7 4 54 865
8 1 24 597
9 10 66 928

df2

    A   B   C
0 2 87 669
1 5 99 594
2 6 50 989
3 10 46 767
4 3 56 828
5 4 83 415
6 1 41 332

只有当 A 列的值匹配时,我如何减去 B 列 (df['B'] - df2['B'])?所以我可以在 df1 中获得一个新列,例如:

9
23
-14
-34
22
31
-26
-29
-17
20

最佳答案

要获取要减去的值,请获取 df1['A'] 并通过索引 df2['B'] 的值映射到它>df2['B']df2['A']:

df1['new'] = df1['B'] - df1['A'].map(df2.set_index('A')['B'])

结果输出:

    A   B    C  new
0 2 96 826 9
1 1 64 601 23
2 1 27 343 -14
3 5 65 600 -34
4 10 68 658 22
5 6 81 895 31
6 5 73 440 -26
7 4 54 865 -29
8 1 24 597 -17
9 10 66 928 20

编辑

对于较小的数据集,为 map 提供字典可能会稍微快一些。

示例数据集上的时间:

%timeit df1.B - df1.A.map(df2.set_index('A').B)
%timeit df1.B - df1.A.map(dict(zip(df2.A, df2.B)))
%timeit df1.B - df1.A.map(dict(zip(df2.A.values, df2.B.values)))

1000 loops, best of 3: 718 µs per loop
1000 loops, best of 3: 492 µs per loop
1000 loops, best of 3: 459 µs per loop

对于较大的数据集,使用索引方法似乎更快。

更大的数据集设置:

rows, a_max, b_max, c_max = 10**6, 5*10**4, 10**5, 10**5
df1 = pd.DataFrame({'A': randint(1, a_max, rows), 'B': randint(10, b_max, rows), 'C': randint(100, c_max, rows)})
df2 = pd.DataFrame({'A': randint(1, a_max, rows), 'B': randint(10, b_max, rows), 'C': randint(100, c_max, rows)})
df2 = df2.drop_duplicates(subset=['A'])

更大数据集上的时间:

%timeit df1.B - df1.A.map(df2.set_index('A').B)
%timeit df1.B - df1.A.map(dict(zip(df2.A, df2.B)))
%timeit df1.B - df1.A.map(dict(zip(df2.A.values, df2.B.values)))

10 loops, best of 3: 114 ms per loop
10 loops, best of 3: 359 ms per loop
10 loops, best of 3: 354 ms per loop

关于python - 如何根据 Pandas 中的匹配列减去行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44421186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com