将spark DataFrame列转换为python lis

2024-04-29 13:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个有两列mvv和count的数据帧上工作。

+---+-----+
|mvv|count|
+---+-----+
| 1 |  5  |
| 2 |  9  |
| 3 |  3  |
| 4 |  1  |

我想获得包含mvv值和count值的两个列表。有点像

mvv = [1,2,3,4]
count = [5,9,3,1]

所以,我尝试了以下代码:第一行应该返回一个python行列表。我想看看第一个价值:

mvv_list = mvv_count_df.select('mvv').collect()
firstvalue = mvv_list[0].getInt(0)

但是第二行出现了一条错误消息:

AttributeError: getInt


Tags: 数据代码消息df列表count错误select
3条回答

这将把所有元素作为一个列表提供给您。

mvv_list = list(
    mvv_count_df.select('mvv').toPandas()['mvv']
)

你看,为什么你这样做是行不通的。首先,您试图从Row类型中获取整数,您的collect的输出如下:

>>> mvv_list = mvv_count_df.select('mvv').collect()
>>> mvv_list[0]
Out: Row(mvv=1)

如果你吃了这样的东西:

>>> firstvalue = mvv_list[0].mvv
Out: 1

您将得到mvv值。如果需要数组的所有信息,可以采用以下方法:

>>> mvv_array = [int(row.mvv) for row in mvv_list.collect()]
>>> mvv_array
Out: [1,2,3,4]

但如果你在另一个专栏中尝试同样的方法,你会得到:

>>> mvv_count = [int(row.count) for row in mvv_list.collect()]
Out: TypeError: int() argument must be a string or a number, not 'builtin_function_or_method'

这是因为count是一个内置方法。该列与count同名。解决方法是将count的列名更改为_count

>>> mvv_list = mvv_list.selectExpr("mvv as mvv", "count as _count")
>>> mvv_count = [int(row._count) for row in mvv_list.collect()]

但不需要这种解决方法,因为您可以使用字典语法访问列:

>>> mvv_array = [int(row['mvv']) for row in mvv_list.collect()]
>>> mvv_count = [int(row['count']) for row in mvv_list.collect()]

最终会成功的!

下面一行给出了您想要的列表。

mvv = mvv_count_df.select("mvv").rdd.flatMap(lambda x: x).collect()

相关问题 更多 >