gpt4 book ai didi

python - Pandas 数据框索引匹配

转载 作者:行者123 更新时间:2023-12-04 18:02:05 24 4
gpt4 key购买 nike

我想知道是否有更有效的方法来执行 Excel 中流行的“索引和匹配”类型函数。例如 - 给定两个 Pandas DataFrame,用在 df_2 中找到的信息更新 df_1:

import pandas as pd

df_1 = pd.DataFrame({'num_a':[1, 2, 3, 4, 5],
'num_b':[2, 4, 1, 2, 3]})
df_2 = pd.DataFrame({'num':[1, 2, 3, 4, 5],
'name':['a', 'b', 'c', 'd', 'e']})

我正在处理在 df_1 和 df_2 中都有约 80,000 行的数据集,我的目标是在 df_1 中创建两个新列,“name_a”和“name_b”。

下面是我能想到的最有效的方法。一定有更好的方法!
name_a = []
name_b = []
for i in range(len(df_1)):

name_a.append(df_2.name.iloc[df_2[
df_2.num == df_1.num_a.iloc[i]].index[0]])
name_b.append(df_2.name.iloc[df_2[
df_2.num == df_1.num_b.iloc[i]].index[0]])

df_1['name_a'] = name_a
df_1['name_b'] = name_b

导致:
>>> df_1.head()
num_a num_b name_a name_b
0 1 2 a b
1 2 4 b d
2 3 1 c a
3 4 2 d b
4 5 3 e c

最佳答案

高层

  • 创建一个字典以在 replace 中使用
  • replace , rename列和 join

  • m = dict(zip(
    df_2.num.values.tolist(),
    df_2.name.values.tolist()
    ))

    df_1.join(
    df_1.replace(m).rename(
    columns=lambda x: x.replace('num', 'name')
    )
    )

    num_a num_b name_a name_b
    0 1 2 a b
    1 2 4 b d
    2 3 1 c a
    3 4 2 d b
    4 5 3 5 c

    故障
    replace用字典应该很快。有很多方法可以构建字典表单 df_2 .事实上,我们可以使用 pd.Series .我选择用 dict 构建和 zip因为我发现它更快。

    大厦m

    选项1
    m = df_2.set_index('num').name

    选项 2
    m = df_2.set_index('num').name.to_dict()

    选项 3
    m = dict(zip(df_2.num, df_2.name))

    选项 4(我的选择)
    m = dict(zip(df_2.num.values.tolist(), df_2.name.values.tolist()))
    m构建时间
    1000 loops, best of 3: 325 µs per loop
    1000 loops, best of 3: 376 µs per loop
    10000 loops, best of 3: 32.9 µs per loop
    100000 loops, best of 3: 10.4 µs per loop

    %timeit df_2.set_index('num').name
    %timeit df_2.set_index('num').name.to_dict()
    %timeit dict(zip(df_2.num, df_2.name))
    %timeit dict(zip(df_2.num.values.tolist(), df_2.name.values.tolist()))

    更换 num

    同样,我们有选择,这里有一些和他们的时间。
    %timeit df_1.replace(m)
    %timeit df_1.applymap(lambda x: m.get(x, x))
    %timeit df_1.stack().map(lambda x: m.get(x, x)).unstack()

    1000 loops, best of 3: 792 µs per loop
    1000 loops, best of 3: 959 µs per loop
    1000 loops, best of 3: 925 µs per loop

    我选择...
    df_1.replace(m)

    num_a num_b
    0 a b
    1 b d
    2 c a
    3 d b
    4 5 c

    重命名列
    df_1.replace(m).rename(columns=lambda x: x.replace('num', 'name'))

    name_a name_b <-- note the column name change
    0 a b
    1 b d
    2 c a
    3 d b
    4 5 c

    加入
    df_1.join(df_1.replace(m).rename(columns=lambda x: x.replace('num', 'name')))

    num_a num_b name_a name_b
    0 1 2 a b
    1 2 4 b d
    2 3 1 c a
    3 4 2 d b
    4 5 3 5 c

    关于python - Pandas 数据框索引匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44318844/

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