Преобразовать искру столбца DataFrame в список 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

Ответы

Ответ 1

Видите, почему этот способ, которым вы занимаетесь, не работает. Во-первых, вы пытаетесь получить целое число из типа строки, результат вашего сбора такой:

>>> 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()]

И это наконец-то сработает!

Ответ 2

После одного лайнера вы получите список, который вы хотите.

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

Ответ 3

Это даст вам все элементы в виде списка.

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

Ответ 4

Следующий код поможет вам

mvv_count_df.select('mvv').rdd.map(lambda row : row[0]).collect()

Ответ 5

Если вы получили ошибку ниже:

AttributeError: у объекта 'list' нет атрибута 'collect'

Этот код решит ваши проблемы:

mvv_list = mvv_count_df.select('mvv').collect()

mvv_array = [int(i.mvv) for i in mvv_list]

Ответ 6

Вместо mvv и count у меня есть Country и 1980?? как я могу преобразовать в список??

+---------+--------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|HDI Rank |            Country | 1980| 1985| 1990| 1995| 2000| 2005| 2006| 2007| 2008| 2009| 2010| 2011| 2012| 2013|
+---------+--------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|        1|            Norway  |0.666|0.699| 0.75|0.805| 0.87| 0.91|0.912|0.909|0.903|0.902|0.907| 0.91| 0.91| 0.91|
|        2|         Australia  | 0.87| 0.87|0.874|0.894|0.895|0.902|0.905|0.907|0.913|0.916|0.919|0.922|0.927|0.927|
|        3|       Switzerland  |0.678|0.675|0.695|0.726|0.804|0.822|0.827|0.828| 0.83|0.834|0.841|0.844|0.844|0.844|
|        4|       Netherlands  |0.667|0.686|0.744|0.811|0.824|0.844| 0.85| 0.86| 0.86|0.859|0.866|0.892|0.894|0.894|
|        5|     United States  | 0.79|0.805|0.834|0.861| 0.85|0.867| 0.87|0.876| 0.88|0.884|0.887| 0.89| 0.89| 0.89|
|        6|           Germany  | 0.59|  0.6|0.646|0.739|0.787|0.858|0.872|0.875|0.877|0.879|0.879|0.884|0.884|0.884|
|        7|       New Zealand  | 0.76|0.772|0.794|0.864|0.885|0.908| 0.91|0.911|0.913|0.915|0.917|0.917|0.917|0.917|
|        8|            Canada  |0.749|0.763|0.809|0.826|0.808|0.853|0.853|0.852|0.851|0.851| 0.85| 0.85| 0.85| 0.85|
|        9|         Singapore  |  .. |  .. |0.545| 0.58|0.606|0.667|0.684|0.698|0.714|0.715|0.759|0.759|0.759|0.768|
|       10|           Denmark  |0.672|0.704|0.711|0.751|0.804|0.864|0.863|0.865|0.867|0.868|0.873|0.873|0.873|0.873|
|       11|           Ireland  |0.633|0.666|0.697|0.743|0.837|0.866|0.867| 0.88|0.884|0.886|0.887|0.887|0.887|0.887|
|       12|            Sweden  |0.659|0.665|0.692|0.792|0.866| 0.83|0.827|0.824|0.824|0.823|0.833| 0.83| 0.83| 0.83|
|       13|           Iceland  |0.598|0.639|0.673|0.732|0.786|0.829|0.833|0.836| 0.84|0.843|0.847|0.847|0.847|0.847|
|       14|    United Kingdom  |0.608|0.622|0.642|0.791|0.836|0.866|0.854|0.852|0.859|0.865|0.878| 0.86| 0.86| 0.86|
|       15|Hong Kong, China ...| 0.53|0.589|0.626|0.639|0.648|0.683| 0.69|0.713|0.748|0.758|0.759|0.762|0.767|0.767|
|       15|Korea (Republic o...|0.565|0.638|0.679|0.743|0.797|0.837|0.843|0.848|0.854|0.856|0.862|0.865|0.865|0.865|
|       17|             Japan  |0.663|0.681|0.699| 0.74|0.767|0.785| 0.79|0.792|0.795|  0.8|0.802|0.808|0.808|0.808|
|       18|     Liechtenstein  |  .. |  .. |  .. |  .. |  .. |  .. |  .. |  .. |  .. |  .. | 0.75|0.762|0.762|0.762|
|       19|            Israel  |0.675|0.706|0.714|0.764| 0.82|0.848|0.846|0.849|0.844|0.847|0.848|0.851|0.854|0.854|
|       20|            France  |0.543|0.571|0.633|0.728|0.761| 0.79|0.792|0.796|  0.8|0.803|0.807|0.813|0.816|0.816|
+---------+--------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

Ответ 7

По моим данным я получил эти тесты:

>>> data.select(col).rdd.flatMap(lambda x: x).collect()

0,52 сек

>>> [row[col] for row in data.collect()]

0,271 сек

>>> list(data.select(col).toPandas()[col])

0,427 сек

Результат тот же