python - 使用来自另一个数据帧的数据在不使用 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 多分钟,我想知道它是否可以使用另一种方法更快地运行。
先感谢您。
解决方案
首先创建一个系列映射df_2
:
s = df_2.set_index('Col_2_1')['Col_2_2']
然后有条件地映射到df_1
using 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
用于按元素决定是选择第二个参数还是第三个参数。
推荐阅读
- html - 如何在不看到滚动条的情况下使网站可滚动?
- python - 在python中使用键,一个dict中的值来获取另一个dict中的值
- apache-spark - spark pypsark 错误 ImportError:无法导入名称'SparkContext'
- android - 在 Firebase 存储中使用多存储桶是否正确?
- flutter - 防止小部件填充Flutter中扩展的祖先
- ios - Swift - 在 iOS 12 中将字体设置为斜体时,fontDescriptor 返回 NIL
- deep-learning - 在最终池化层之后,如何在 vgg 网络中找到激活对应的原始图像中的哪个补丁
- php - Eloquent:如何按其他表中的列总和排序
- nativescript - 与团队分享 Nativescript 原型
- android - Android 使用 AsyncTask 通信不起作用