我想将数据框中的一列月份数字更改为月份名称(pyspark)
I want to change a column of month numbers in a dataframe to month name (pyspark)
我在数据框中有一列月份数字,想将其更改为月份名称,所以我使用了这个:
df['monthName'] = df['monthNumber'].apply(lambda x: calendar.month_name[x])
但它抛出以下错误:
类型错误:'Column'对象不可调用
请建议我有什么方法可以解决这个问题。我是 python 和 spark
的新手
Edit1:我正在使用 Spark 2.1.1 和 Python 2.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")
我正在尝试用 Month vs ArrDelay 绘制图表。从上面的代码中,我得到了月份作为数字。所以我尝试了以下选项
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
定义数据框和select列
3个
month_lst[int(x%12) - 1]
这是重要的部分,我只假设输入是一个浮点数,return 列表中的一个值
如果您需要更多帮助,请添加评论,
我会尽可能避免使用 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'))
日期格式代码详情:
http://tutorials.jenkov.com/java-internationalization/simpledateformat.html
您可以执行以下步骤:
输入
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))
输出:5 月
from pyspark.sql 将函数导入为 F
如果 'date' 列具有日期格式
.withColumn("月份", F.date_format(F.col("日期"), 'MMMM'))
我在数据框中有一列月份数字,想将其更改为月份名称,所以我使用了这个:
df['monthName'] = df['monthNumber'].apply(lambda x: calendar.month_name[x])
但它抛出以下错误:
类型错误:'Column'对象不可调用
请建议我有什么方法可以解决这个问题。我是 python 和 spark
的新手Edit1:我正在使用 Spark 2.1.1 和 Python 2.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")
我正在尝试用 Month vs ArrDelay 绘制图表。从上面的代码中,我得到了月份作为数字。所以我尝试了以下选项
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
定义数据框和select列
3个
month_lst[int(x%12) - 1]
这是重要的部分,我只假设输入是一个浮点数,return 列表中的一个值
如果您需要更多帮助,请添加评论,
我会尽可能避免使用 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'))
日期格式代码详情: http://tutorials.jenkov.com/java-internationalization/simpledateformat.html
您可以执行以下步骤: 输入 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))
输出:5 月
from pyspark.sql 将函数导入为 F
如果 'date' 列具有日期格式
.withColumn("月份", F.date_format(F.col("日期"), 'MMMM'))