繁体   English   中英

使用来自另一个数据帧的数据在不使用for循环的情况下使用条件在数据框中创建列

[英]Creating columns in a dataframe using data from another dataframe with conditions without using for loops

我有两个数据帧,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多分钟才能完成,我想知道是否可以使用其他方法更快地运行它。

先感谢您。

首先从df_2创建一个系列映射:

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

然后映射有条件地df_1使用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用它来决定是否选择第二个或第三个参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM