首页 > 解决方案 > 使用来自另一个数据帧的数据在不使用 for 循环的情况下使用来自另一个数据帧的数据在数据帧中创建列

问题描述

我有两个数据框,df_1 和 df_2

df_1 有 30k+ 行,看起来像这样

Col_1_1    Col_1_2    CA_CB
a          c          CA
a          c          CB
a          d          CA
b          c          CA
b          d          CB
b          d          CB
b          c          CA

如果列 CA_CB = "CB",我想使用来自 df_2 的数据在 df_1 中创建两列

df_2 有 1k 行,看起来像这样(Col_2_1 具有唯一值)

Col_2_1    Col_2_2
a          data on a
b          data on b
c          data on c
d          data on d

我的输出应该是这样的:

Col_1_1    Col_1_2    CA_CB    Col_target_1    Col_target_2
a          c          CA       "X"             "X"
a          c          CB       data on a       data on c
a          d          CA       "X"             "X"
b          c          CA       "X"             "X"
b          d          CB       data on b       data on d
b          d          CB       data on b       data on d
b          c          CA       "X"             "X"

我目前这样做的方式是创建 Col_target_1 和 Col_target_2

df_1["Col_target_1"] = "X"
df_2["Col_target_2"] = "X"

for i in range(len(df_1)):
    if df_1["CA_CB"][i] == "CB":
        for j in range(len(df_2)):
            if df_1["Col_1_1"][i] == df_2["Col_2_1"][j]:
                df_1["Col_target_1"][i] = df_2["Col_2_2"][j]
            if df_1["Col_1_2"][i] == df_2["Col_2_1"][j]:
                df_1["Col_target_2"][i] = df_2["Col_2_2"][j]

这是做我想做的工作。但是这样做需要 20 多分钟,我想知道它是否可以使用另一种方法更快地运行。

先感谢您。

标签: pythonpython-3.xpandasdataframeseries

解决方案


首先创建一个系列映射df_2

s = df_2.set_index('Col_2_1')['Col_2_2']

然后有条件地映射到df_1using numpy.where

mask = df_1['CA_CB'] == 'CB'

df_1['Col_target_1'] = np.where(mask, df_1['Col_1_1'].map(s), 'X')
df_1['Col_target_2'] = np.where(mask, df_1['Col_1_2'].map(s), 'X')

mask返回一个布尔系列,np.where用于按元素决定是选择第二个参数还是第三个参数。


推荐阅读