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