Python 熊猫。将Loc应用于Pyspark

Python 熊猫。将Loc应用于Pyspark,python,pandas,apache-spark,pyspark,apache-spark-sql,Python,Pandas,Apache Spark,Pyspark,Apache Spark Sql,我对熊猫做了一些工作。现在我需要在Pyspark上做同样的事情,这个任务看起来很棘手 这是我的密码: import pandas as pd def av_years(df,start,end): return df.loc[df['year'].isin(range(start,end+1))]['B'].mean() 然后我创建了一个数据帧: raw_data = { 'year': [2010,2011,2012,2013], 'B': [2,3,5,4],'start

我对熊猫做了一些工作。现在我需要在Pyspark上做同样的事情,这个任务看起来很棘手

这是我的密码:

import pandas as pd
def av_years(df,start,end):
return df.loc[df['year'].isin(range(start,end+1))]['B'].mean() 
然后我创建了一个数据帧:

raw_data = {
    'year': [2010,2011,2012,2013],
    'B': [2,3,5,4],'startyear':[2012,2010,2011,2011],'endyear':
     [2012,2013,2013,2013]}
     df = pd.DataFrame(raw_data)
     df
  df['av'] = df.apply(lambda row: av_years(df,row['startyear'], 
  row['endyear']), axis=1)
  df
这是我的结果:

    B   endyear startyear   year
    0   2   2012    2012    2010
    1   3   2013    2010    2011
    2   5   2013    2011    2012
    3   4   2013    2011    2013
最后一步是创建从dataframe派生的新列:

raw_data = {
    'year': [2010,2011,2012,2013],
    'B': [2,3,5,4],'startyear':[2012,2010,2011,2011],'endyear':
     [2012,2013,2013,2013]}
     df = pd.DataFrame(raw_data)
     df
  df['av'] = df.apply(lambda row: av_years(df,row['startyear'], 
  row['endyear']), axis=1)
  df
我的最终结果是:

 B  endyear startyear   year    av
 0  2   2012    2012    2010    5.0
 1  3   2013    2010    2011    3.5
 2  5   2013    2011    2012    4.0
 3  4   2013    2011    2013    4.0
我需要使用PySpark获得相同的表!有什么建议吗


感谢您对数据帧中的每一行进行迭代,以遍历数据帧复杂性n²中的所有行。这相当于执行自联接。 在对验证条件r2.year.isinranger1.startyear、r1.endyear+1的行r1、r2进行筛选后,可以按startyear、endyear、year进行分组以计算平均值B

注:在Spark中,您可以一步完成连接和过滤

首先,让我们从数据框中创建数据框:

数据=spark.createDataFramedf 对于自联接,我们将使用别名以避免与列名冲突:

将pyspark.sql.functions作为psf导入 data\u join=data.selectstartyear、endyear、year.aliasleft\ 参加 data.selectB,year.aliasright, psf.colright.year.between psf.colleft.startyear,psf.colleft.endyear\ 一年 +-----+----+--+--+ |起始年|结束年|年| B| +-----+----+--+--+ | 2010| 2013|2011| 2| | 2010| 2013|2011| 3| | 2012| 2012|2010| 5| | 2010| 2013|2011| 5| | 2010| 2013|2011| 4| | 2011| 2013|2012| 3| | 2011| 2013|2013| 3| | 2011| 2013|2012| 5| | 2011| 2013|2012| 4| | 2011| 2013|2013| 5| | 2011| 2013|2013| 4| +-----+----+--+--+ 现在请看groupBy:

数据连接\ .groupBystartyear、endyear、year\ .aggpsf.avgB.aliasav.show +-----+----+--+--+ |起始年|结束年|年| av| +-----+----+--+--+ | 2011| 2013|2013|4.0| | 2010| 2013|2011|3.5| | 2012| 2012|2010|5.0| | 2011| 2013|2012|4.0| +-----+----+--+--+ 下面是另一种方法:

raw_data=sc.parallelize(['2\t2012\t2012\t2010\t5.0', \
                        '3\t2013\t2010\t2011\t3.5', \
                        '5\t2013\t2011\t2012\t4.0', \
                        '4\t2013\t2011\t2013\t4.0']).map(lambda x: x.split('\t'))\
                                                      .map(lambda x: (int(x[0]),int(x[1])\
                                                      ,int(x[2]),int(x[3]),float(x[4])))

raw_data_df=sqlContext.createDataFrame(rawdata,['B','endyear','startyear','year','av'])

raw_data_df.show()

+---+-------+---------+----+---+
|  B|endyear|startyear|year| av|
+---+-------+---------+----+---+
|  2|   2012|     2010|2010|5.0|
|  3|   2013|     2010|2011|3.5|
|  5|   2013|     2011|2012|4.0|
|  4|   2013|     2011|2013|4.0|
+---+-------+---------+----+---+
假设您将数据保存在csv文件中:

这是文件名raw_data.csv中的外观:

导入必要的模块:

from pyspark.sql.types import StructType, StructField, DoubleType, IntegerType, Row
import pyspark.sql.functions as func
from pyspark.sql import SparkSession
定义结构并读取文件:

rawdata_path = 'raw_data.csv'

rawdata_struct = artistdata_struct = StructType([StructField('B', IntegerType()), \
                                                 StructField('endyear', IntegerType()), \
                                                 StructField('startyear',IntegerType()), \
                                                 StructField('year',IntegerType()),\
                                                 StructField('av',DoubleType())])

rawdata= spark.read.csv(rawdata_path, sep = ',', schema = rawdata_struct)

rawdata.show()

+---+-------+---------+----+---+
|  B|endyear|startyear|year| av|
+---+-------+---------+----+---+
|  2|   2012|     2010|2010|5.0|
|  3|   2013|     2010|2011|3.5|
|  5|   2013|     2011|2012|4.0|
|  4|   2013|     2011|2013|4.0|
|  3|   2008|     2011|2011|4.0|
|  5|   2013|     2019|2012|4.0|
|  4|   2005|     2012|2016|4.0|
|  4|   2013|     2013|2012|4.0|
|  8|   2018|     2014|2018|4.0|
|  5|   2013|     2014|2012|4.0|
+---+-------+---------+----+---+
有关Spark数据类型的更多信息,请查看此链接


我创建了一个小的数据框,以便于卸载!实际上,我使用的是一个巨大的数据帧。那么,当我有一个非常大的数据帧时,我如何应用你的方法呢?谢谢!我修正了上面的答案。我假设您的数据位于.csv文件中。您可以修改分隔符以匹配原始文件中的内容。谢谢您,玛丽!没问题丽珠:如果你的问题真的解决了,别忘了把它标为已经解决了