Python 要作为行级函数的参数传递的dataframe列,以将列的每个值应用于其各自的行

Python 要作为行级函数的参数传递的dataframe列,以将列的每个值应用于其各自的行,python,pandas,Python,Pandas,!![在此处输入图像描述][1] 我有一个奇怪的需求,需要添加一个类似于下面oracle查询的列,以应用于python dataframe。要作为行级函数的参数传递的dataframe列,以将列的每个值应用于其各自的行 select employee_id, first_name, last_name, substr(first_name, employee_id/employee_id, 3) test1 from hr.EMPLOYEES 结果已附加在下面的csv文件中。 我想添加一个新列

!![在此处输入图像描述][1]

我有一个奇怪的需求,需要添加一个类似于下面oracle查询的列,以应用于python dataframe。要作为行级函数的参数传递的dataframe列,以将列的每个值应用于其各自的行

select employee_id, first_name, last_name, substr(first_name, employee_id/employee_id, 3) test1 from hr.EMPLOYEES
结果已附加在下面的csv文件中。 我想添加一个新列。所以我写了我的熊猫声明如下

EMPLOYEE.assign(test1=EMPLOYEE.FIRST_NAME.str.slice(EMPLOYEE.EMPLOYEE_ID.apply(lambda x: x/x),4))
在这段代码中,我在EMPLOYEE.FIRST\u NAME列的slice函数中使用EMPLOYEE.EMPLOYEE\u ID

我的意图是,如果我们认为这是一个变量

FIRST_NAME="Steven"
EMPLOYEE_ID=100
FIRST_NAME[int(EMPLOYEE_ID/EMPLOYEE_ID):4]
这个的输出是
'tev'

如果我在dataframe上应用相同的概念,它将不起作用。 我没有得到子字符串,而是得到NaN。 我的Python输出如下

下面是SQL查询的输出

    EMPLOYEE_ID   FIRST_NAME  LAST_NAME TEST1
0           100       Steven       King   Ste
1           101        Neena    Kochhar   Nee
2           102          Lex    De Haan   Lex
3           103    Alexander     Hunold   Ale
4           104        Bruce      Ernst   Bru
5           105        David     Austin   Dav
6           106        Valli  Pataballa   Val
7           107        Diana    Lorentz   Dia
8           108        Nancy  Greenberg   Nan
9           109       Daniel     Faviet   Dan
10          110         John       Chen   Joh
11          111       Ismael    Sciarra   Ism
12          112  Jose Manuel      Urman   Jos
13          113         Luis       Popp   Lui
我们可以通过创建一个新列来完成,但是,正如在SQL中一样,我们可以直接完成。我期待着熊猫也能做到这一点。请在这方面帮助我


我的预期输出与上面相同。但是,我正在编写一个通用脚本,将SQL查询转换为数据框架。我一直致力于实现这样的场景,即有一列作为行级函数的参数传递。

尝试:

res = df[['EMPLOYEE_ID', 'FIRST_NAME', 'LAST_NAME']].assign(pre=df['FIRST_NAME'].str[:3])
print(res)
输出

    EMPLOYEE_ID   FIRST_NAME  LAST_NAME  pre
0           100       Steven       King  Ste
1           101        Neena    Kochhar  Nee
2           102          Lex    De Haan  Lex
3           103    Alexander     Hunold  Ale
4           104        Bruce      Ernst  Bru
5           105        David     Austin  Dav
6           106        Valli  Pataballa  Val
7           107        Diana    Lorentz  Dia
8           108        Nancy  Greenberg  Nan
9           109       Daniel     Faviet  Dan
10          110         John       Chen  Joh
11          111       Ismael    Sciarra  Ism
12          112  Jose Manuel      Urman  Jos
13          113         Luis       Popp  Lui
要与do一起使用,请执行以下操作:

其中,站点为:

stop int,切片操作的可选停止位置

基本上一次迭代一个字符,并在位置3处停止(不包括在内)

以上就是我的答案。但是它比另一个慢

%timeit EMPLOYEE.apply(lambda i: i.FIRST_NAME[int(i.EMPLOYEE_ID/i.EMPLOYEE_ID):3], axis=1)
每个回路1.38 ms±58.8µs(7次运行的平均值±标准偏差,每个1000个回路)


948µs±22.9µs/圈(平均±标准偏差为7次,每次1000圈)

非常感谢您在Dani的快速响应。但是,我想知道在另一个列函数中使用列的可能性。在我的示例中,我使用了数字列除以自身,这意味着该列每行返回1。但是,apply函数计算我的整个列,并传递每行的所有值。相反,我可以限制它按索引使用相应的行吗?您的预期输出是什么?我不明白,但似乎你想用apply?查询的输出不等于我刚才编写的pandas代码吗?我的预期输出与您提供的相同。但是,我正在编写一个通用脚本,将SQL查询转换为数据框架。我被困在实现这样的场景中,其中有一列作为行级函数的参数传递。您的目标非常复杂,不是问题中所表达的内容,可能无法在简单的帖子中回答。是的,我理解。我很抱歉。我的问题不是很直截了当。请添加整个场景,您所说的“有一列作为行级函数的参数传递的场景”是什么意思?嗨@DaniMesejo,我已经更新了我的问题。有谁能给我一个比我的方法更好的解决方案吗?
df[['EMPLOYEE_ID', 'FIRST_NAME', 'LAST_NAME']].apply(lambda i: i.FIRST_NAME[int(i.EMPLOYEE_ID/i.EMPLOYEE_ID):4], axis=1)
%timeit EMPLOYEE.apply(lambda i: i.FIRST_NAME[int(i.EMPLOYEE_ID/i.EMPLOYEE_ID):3], axis=1)
%timeit EMPLOYEE[['EMPLOYEE_ID', 'FIRST_NAME', 'LAST_NAME']].assign(pre=EMPLOYEE['FIRST_NAME'].str[1:4])