我有两个类似的数据帧,如下所示:

import pandas as pd

num1 = ["1111 2222", "3333", "4444 5555 6666", "7777 8888", "9999"]
num2 = ["A1", "A2", "A3", "A4", "A5"] 
linkage = pd.DataFrame({"num1":num1, "num2":num2})
num1 = ["2222", "3333", "5555", "8888", "9999"]
num2 = ['none', 'none', 'none', 'none', 'none']
df = pd.DataFrame({"num1":num1, "num2":num2})

联动装置:

num1            num2 
1111 2222       A1 
3333            A2 
4444 5555 6666  A3 
7777 8888       A4 
9999            A5 

数据框:

num1   num2
2222   none
3333   none
5555   none
8888   none
9999   none

我想根据第二个数据帧的"num1"值是否是链接数据帧中的"num1"值之一,将链接数据帧中的"num2"值放置在第二个数据帧中.我目前拥有的代码是:

df.num2 = [linkage.num2[i] for y in df.num1 for i, x in enumerate(linkage.num1) if y in x]

这就产生了我想要的:

num1   num2
2222   A1
3333   A2
5555   A3
8888   A4
9999   A5

但是,数据帧越大,代码速度明显越慢.CPU times: total: 516 ms

推荐答案

split字符串和explode,然后使用它来map数据:

mapper = (linkage.assign(num1=linkage['num1'].str.split())
                 .explode('num1')
                 .set_index('num1')['num2']
          )

df['num2'] = df['num1'].map(mapper)

输出:

   num1 num2
0  2222   A1
1  3333   A2
2  5555   A3
3  8888   A4
4  9999   A5

中级mapper:

num1
1111    A1
2222    A1
3333    A2
4444    A3
5555    A3
6666    A3
7777    A4
8888    A4
9999    A5
Name: num2, dtype: object

Python相关问答推荐

Pandas 第二小值有条件

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

Pandas 都是(),但有一个门槛

使可滚动框架在tkinter环境中看起来自然

ODE集成中如何终止solve_ivp的无限运行

如何创建一个缓冲区周围的一行与manim?

DataFrames与NaN的条件乘法

导入...从...混乱

Django—cte给出:QuerySet对象没有属性with_cte''''

Python中的变量每次增加超过1

判断solve_ivp中的事件

Pandas—堆栈多索引头,但不包括第一列

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´

无法在Spyder上的Pandas中将本地CSV转换为数据帧

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

PySpark:如何最有效地读取不同列位置的多个CSV文件

Pandas数据框上的滚动平均值,其中平均值的中心基于另一数据框的时间

比较两个有条件的数据帧并删除所有不合格的数据帧

如何让PYTHON上的Selify连接到现有的Firefox实例-我无法连接到Marionette端口