如何解决如何将函数应用于给定其他列值的列?
我有一个函数,想要创建一个新列df ['growth_factor'],其中将包含派生值。棘手的是,该函数的每一行都需要传递另外两列。
.prototype
我该如何实现?
解决方法
执行此查询的方法更快,但这是一种简单的方法:
let flattenedArr = [];
const flatten = (arr) => { //pass the array
for (let i of arr) { // get element of the array
if (Array.isArray(i)) { // check if element is of type array
flatten(i); // call same function again (recursion)
} else flattenedArr.push(i); // else push to flattenedArr
}
return flattenedArr; // return flattenedArr
};
console.log(flatten([1,[32],[3],[3,5,[4]]]));
作为一种替代方法,您可以将growth_factor函数中的信息放入第二个数据帧,然后将其连接到df(使用pd.merge())。
,这只是时间比较而不是答案。在这种情况下,最灵活的解决方案是@jsmart,但@ MrNobody33提供了最快的解决方案
数据
import pandas as pd
import numpy as np
df = pd.DataFrame({"city":["losangeles","losangeles","newyork"],"beds":[3,4,4]})
@jsmart的解决方案
def growth_factor(city,beds):
if beds==3:
if city == 'losangeles' : return 45
else: False
elif beds==4:
if city == 'losangeles' : return 47
elif city == 'newyork' : return 50
else: False
else: False
%%timeit -n 1000 -r 10
o = df.apply(
lambda x: growth_factor(x['city'],x['beds']),axis=1)
1.2 ms ± 18.3 µs per loop (mean ± std. dev. of 10 runs,1000 loops each)
@ MrNobody33的解决方案
choices=[45,47,50]
conditions=[(df['beds'].eq(3) & df['city'].eq('losangeles')),(df['beds'].eq(4) & df['city'].eq('losangeles')),(df['beds'].eq(4) & df['city'].eq('newyork'))]
%%timeit -n 1000 -r 10
o = np.select(conditions,choices,default='False')
184 µs ± 14.4 µs per loop (mean ± std. dev. of 10 runs,1000 loops each)
速度是 6.5倍。
额外
如果您有一个具有3.000行而不是3行的数据框,那么矢量解决方案就更好了
df = pd.concat([df for i in range(1000)],ignore_index=True)
应用
%%timeit -n 10 -r 10
o = df.apply(
lambda x: growth_factor(x['city'],axis=1)
84.3 ms ± 3.17 ms per loop (mean ± std. dev. of 10 runs,10 loops each)
矢量
%%timeit -n 10 -r 10
o = np.select(conditions,default='False')
437 µs ± 102 µs per loop (mean ± std. dev. of 10 runs,10 loops each)
速度快了 193倍。
,使用np.select
:
import numpy as np
choices=[45,(df['beds'].eq(4) & df['city'].eq('newyork'))]
df['growth_factor']=np.select(conditions,default='False')
输出:
df
city beds growth_factor
0 losangeles 3 45
1 losangeles 4 47
2 newyork 3 False
,
好的,试试这个:
for index,row in df.iterrows():
g_f = growth_factor(row.city,row.beds)
#print(g_f)
#insert the value into df
row.growth_factor = g_f
基本上,您需要遍历每一行并调用函数以获取growth_factor列值,然后将其分配给df。
此外,我注意到,您的函数针对纽约市值返回False。您可能需要再次检查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。