使用两个字符串参数创建 pandas_udf 函数的最简单方法
The simpliest way to create pandas_udf finction with two string arguments
我需要使用 pandas_udf
对基于两列的字符串进行某些计算。
我的代码如下:
@pandas_udf(BooleanType())
def is_one_pd(ser: pd.Series, ser2: pd.Series) -> pd.Series:
def is_one(s):
return (re.search("1", s.title) is not None) & (re.search("1", s.comp_short) is not None)
df = pd.DataFrame({'title':ser, 'comp_short':ser2})
return df.apply(is_one, 1)
df = spark.createDataFrame(pd.DataFrame([("1", "1"), ("2", "2"), ("3", "3")], columns=["title", "comp_short"]))
df.select(is_one_pd(df.title, df.comp_short)).show()
看起来太复杂了。有没有更好的选择?我需要使用 pandas_udf 因为真实的例子更复杂。
您可以直接在序列上应用正则表达式搜索而无需构建数据框:
import re
from pyspark.sql.functions import pandas_udf
from pyspark.sql.types import BooleanType
import pandas as pd
@pandas_udf(BooleanType())
def is_one_pd(ser: pd.Series, ser2: pd.Series) -> pd.Series:
return (ser.apply(lambda s: re.search("1", s) is not None) &
ser2.apply(lambda s: re.search("1", s) is not None))
df = spark.createDataFrame(pd.DataFrame([("1", "1"), ("2", "2"), ("3", "3")], columns=["title", "comp_short"]))
df.select(is_one_pd(df.title, df.comp_short)).show()
我需要使用 pandas_udf
对基于两列的字符串进行某些计算。
我的代码如下:
@pandas_udf(BooleanType())
def is_one_pd(ser: pd.Series, ser2: pd.Series) -> pd.Series:
def is_one(s):
return (re.search("1", s.title) is not None) & (re.search("1", s.comp_short) is not None)
df = pd.DataFrame({'title':ser, 'comp_short':ser2})
return df.apply(is_one, 1)
df = spark.createDataFrame(pd.DataFrame([("1", "1"), ("2", "2"), ("3", "3")], columns=["title", "comp_short"]))
df.select(is_one_pd(df.title, df.comp_short)).show()
看起来太复杂了。有没有更好的选择?我需要使用 pandas_udf 因为真实的例子更复杂。
您可以直接在序列上应用正则表达式搜索而无需构建数据框:
import re
from pyspark.sql.functions import pandas_udf
from pyspark.sql.types import BooleanType
import pandas as pd
@pandas_udf(BooleanType())
def is_one_pd(ser: pd.Series, ser2: pd.Series) -> pd.Series:
return (ser.apply(lambda s: re.search("1", s) is not None) &
ser2.apply(lambda s: re.search("1", s) is not None))
df = spark.createDataFrame(pd.DataFrame([("1", "1"), ("2", "2"), ("3", "3")], columns=["title", "comp_short"]))
df.select(is_one_pd(df.title, df.comp_short)).show()