Python 要作为行级函数的参数传递的dataframe列,以将列的每个值应用于其各自的行
!![在此处输入图像描述][1] 我有一个奇怪的需求,需要添加一个类似于下面oracle查询的列,以应用于python dataframe。要作为行级函数的参数传递的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文件中。 我想添加一个新列
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])