【问题标题】:Creating columns in a dataframe using data from another dataframe with conditions without using for loops使用来自另一个数据帧的数据在不使用 for 循环的情况下使用来自另一个数据帧的数据在数据帧中创建列
【发布时间】:2018-12-10 19:36:19
【问题描述】:

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

提前谢谢你。

【问题讨论】:

    标签: python python-3.x pandas dataframe series


    【解决方案1】:

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

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

    然后使用numpy.where有条件地映射到df_1

    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 使用它来决定按元素选择第二个还是第三个参数。

    【讨论】:

    • 完美运行!非常感谢 !耗时不到 0.5 秒!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2015-12-31
    • 2021-12-25
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多