[英]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.