对数据框中的一列求和并将结果返回为 int

Posted

技术标签:

【中文标题】对数据框中的一列求和并将结果返回为 int【英文标题】:Sum a column in dataframe and return results as int 【发布时间】:2018-09-20 04:48:53 【问题描述】:

我有一个带有一列数字(数量)的 pyspark 数据框。我需要对该列(数量)求和,然后将结果返回为 python 变量中的 int。

数据集如下所示:

date,p1id,p2id,amount,p3id
1/1/2013,U2_P1,p@c.com,100,P_P

按日期分组聚合。

groupby_revenue = df.groupby(['date']).sum()
print(groupby_revenue)

输出:

DataFrame[visitdate: string]

原始输出:

1/1/2013    13000
1/1/2014    16090
1/1/2015    17330

【问题讨论】:

请分享数据的输出格式。 DataFrame[visitdate: string] 这是我得到的输出 但是需要这样 1/1/2013 13000 1/1/2014 16090 1/1/2015 17330 【参考方案1】:

你需要收集它:

from pyspark.sql import functions as F

groupby_revenue = df.groupby(['date']).agg(F.sum('amount')).collect()[0][0]

【讨论】:

得到以下错误:ValueError: No objects to concatenat【参考方案2】:

使用spark 时,您需要了解它的execution processprogramming api (pyspark - http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html)。它与pandas/python 执行完全不同。它的执行取决于lazy evaluation,每当您需要检查数据时,您需要执行showfirstcollecttake 之类的操作。如果没有这些操作,它会返回 dataframeschema(所以在你的问题中)。

让我通过一个例子向你介绍一些事情:-

process_df = sqlContext.createDataFrame([
    ['2013-01-01','U2_P1','p@c.com','100','P_P'],
    ['2013-01-01','U2_P2','p@c.com','100','P_P1'],
    ['2014-01-01','U2_P1','p@c.com','100','P_P'],
    ['2014-01-01','U2_P2','p@c.com','100','P_P1'],
    ['2015-01-01','U2_P1','p@c.com','100','P_P'],
    ['2015-01-01','U2_P2','p@c.com','100','P_P1']
], ['date','p1id','p2id','amount','p3id'])

#This prints Schema instead of Data
print process_df
DataFrame[date: string, p1id: string, p2id: string, amount: string, p3id: string]

#This prints data instead of schema
process_df.show()
+----------+-----+-------+------+----+
|      date| p1id|   p2id|amount|p3id|
+----------+-----+-------+------+----+
|2013-01-01|U2_P1|p@c.com|   100| P_P|
|2013-01-01|U2_P2|p@c.com|   100|P_P1|
|2014-01-01|U2_P1|p@c.com|   100| P_P|
|2014-01-01|U2_P2|p@c.com|   100|P_P1|
|2015-01-01|U2_P1|p@c.com|   100| P_P|
|2015-01-01|U2_P2|p@c.com|   100|P_P1|
+----------+-----+-------+------+----+

agg_data = process_df.groupby(['date']).agg('amount':'sum')

#This prints Schema instead of Data
print agg_data
DataFrame[date: string, sum(amount): double]

from pyspark.sql import functions as F

#This prints data instead of schema
agg_data.show()
+----------+-----------+
|      date|sum(amount)|
+----------+-----------+
|2015-01-01|      200.0|
|2014-01-01|      200.0|
|2013-01-01|      200.0|
+----------+-----------+

from pyspark.sql import functions as F
agg_data.select('date', F.col('sum(amount)').alias('sum')).show()
+----------+-----+
|      date|  sum|
+----------+-----+
|2015-01-01|200.0|
|2014-01-01|200.0|
|2013-01-01|200.0|
+----------+-----+

这是一个仅打印数据的示例,如果您需要将这些数据输入 然后python需要用到collect,take,first,head。这里有几个 例子:-

print agg_data.collect()
[Row(date=u'2015-01-01', sum(amount)=200.0),
 Row(date=u'2014-01-01', sum(amount)=200.0),
 Row(date=u'2013-01-01', sum(amount)=200.0)]
print agg_data.first()
Row(date=u'2015-01-01', sum(amount)=200.0)
print agg_data.take(1)
[Row(date=u'2015-01-01', sum(amount)=200.0)]
agg_data.head()
Row(date=u'2015-01-01', sum(amount)=200.0)

这就是我们可以将数据带到 python 并对其进行争论的方式。

Hope this will help a lot.

【讨论】:

如何将此数据的输出存储到 spark sql db 中? @user10389226 我找到了这个将数据保存到sql db ***.com/questions/46552161/…的链接,基本上,你需要连接字符串和选项。 如何在windows下安装jdbc驱动?执行时显示 sc 未定义(如何导入 sqlcontext)?

以上是关于对数据框中的一列求和并将结果返回为 int的主要内容,如果未能解决你的问题,请参考以下文章

试图对 postgres 中的一列求和,但试图首先限制结果?

熊猫从数据框中的一列中提取部分字符串并将其存储在一个新列中

微软访问报表汇总功能

如何按 > 日期对一系列日期求和并将它们附加到熊猫新数据框中的新列?

对分组的熊猫数据框中的行求和并返回 NaN

sql对查询结果求和