我想将数据框中的一列月份编号更改为月份名称(pyspark)

我想将数据框中的一列月份编号更改为月份名称(pyspark),pyspark,pyspark-sql,Pyspark,Pyspark Sql,我在数据框中有一列月数,希望将其更改为月名,因此我使用了以下方法: df['monthName'] = df['monthNumber'].apply(lambda x: calendar.month_name[x]) 但它给我带来了以下错误: TypeError:“列”对象不可调用 请告诉我解决这个问题的方法。我不熟悉python和spark Edit1:我正在使用spark2.1.1和python2.7.6 这是我的航空公司数据分析代码 df_withDelay = df_mappedC

我在数据框中有一列月数,希望将其更改为月名,因此我使用了以下方法:

df['monthName'] = df['monthNumber'].apply(lambda x: calendar.month_name[x]) 
但它给我带来了以下错误:

TypeError:“列”对象不可调用

请告诉我解决这个问题的方法。我不熟悉python和spark

Edit1:我正在使用spark2.1.1和python2.7.6

这是我的航空公司数据分析代码

df_withDelay = df_mappedCarrierNames.filter(df_mappedCarrierNames.ArrDelay > 0)
sqlContext.registerDataFrameAsTable(df_withDelay,"SFO_ArrDelayAnalysisTable")
df_SFOArrDelay = sqlContext.sql \
                      ("select sfo.Month, sum(sfo.ArrDelay) as TotalArrivalDelay \
                      from SFO_ArrDelayAnalysisTable sfo \
                      where (sfo.Dest = 'SFO') \
                      group by sfo.Month")
我正试图绘制一个月与月延迟的图表。从上面的代码中,我得到了月数。所以我尝试了下面的选项

udf = UserDefinedFunction(lambda x: calendar.month_abbr[int(x)], StringType())
new_df_mappedCarrierNames = df_mappedCarrierNames.select(*[udf(column).alias(name) if column == name else column for column in df_mappedCarrierNames.columns])
它可以工作,但在我的图表中,它不是按顺序排列的。然而,如果我使用月数,它是按顺序排列的。我的问题是找出如何将月份编号按一月到十二月的排序顺序映射到月份名称。
提前感谢您的回复。

这是干净的解决方案:

from pyspark.sql.functions import UserDefinedFunction
from pyspark.sql.types import StringType

#1
month_lst = ['January', 'Feburary', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
#2
df = sqlContext.createDataFrame( [(1, "a", 23.0), (3, "B", -23.0)], ("x1", "x2", "x3"))

name = 'x1'
#3
udf = UserDefinedFunction(lambda x: month_lst[int(x%12) - 1], StringType())
new_df = df.select(*[udf(column).alias(name) if column == name else column for column in df.columns])
1. 你可以编一本字典

2. 定义数据帧并选择列 3.
month\u lst[int(x%12)-1]
这是一个重要的部分,我只假设输入是一个浮点值,并从列表中返回一个值


如果您需要更多帮助,请添加注释,

如果可能,我将避免使用UDF(因为它们不能很好地扩展)。尝试to_date()、date_format()和强制转换为整数的组合:

from pyspark.sql.functions import col

df = df.withColumn('monthNumber', date_format(to_date(col('monthName'), 'MMMMM'), 'MM').cast('int'))
日期格式代码的详细信息:

您可以执行以下步骤: 输入 2012年5月20日

过程

df_train = df_train.withColumn("dates", from_unixtime(unix_timestamp(df_train.dates, 'MMMMM dd  yyy')))
输出:2012-05-20 00:00:00

month_udf = udf(lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S').strftime("%B"), returnType = StringType())
dftest = df_train.withColumn("monthname", month_udf(df_train.dates))

输出:May

Yeey,好吧,这应该是设置而不是选项,但总而言之是的,请将我的答案标记为解决方案;)谢谢!我使用了udf和withColumn。引入了一个新的列,为该列应用udf=F.UserDefinedFunction(lambda x:calendar.month_abbr[int(x)],StringType())df_withDelay_month=df_withDelay.withColumn('MonthName',udf(“month”))我同意应该避免使用udf,但当op询问“月名”时,这个答案会产生月数