#dataframe #apache-spark #pyspark
Вопрос:
У меня есть фрейм данных, в котором 3 столбца, теперь я добавил еще один столбец и в который я добавляю уникальные значения с помощью случайной функции. Я создал переменную списка и, используя цикл for, добавляю случайную строку в эту переменную списка. После этого я создал еще один цикл, в котором извлекаю значение списка и добавляю его в значение столбца. Но в каждой строке каждый раз добавляется одно и то же значение.
df = pd.read_csv("test.csv")
lst = []
for i in range(20):
randColumn = ''.join(random.choice(string.ascii_uppercase string.digits)
for i in range(20))
lst.append(randColumn)
for j in lst:
df['randColumn'] = j
print(df)
#Output.......
A B C randColumn
0 1 2 3 WHI11NJBNI8BOTMA9RKA
1 4 5 6 WHI11NJBNI8BOTMA9RKA
Не могли бы вы, пожалуйста, помочь мне исправить это, почему каждая строка имеет одинаковое значение из списка.
Комментарии:
1.
for j in lst: df['randColumn'] = j
всегда задает каждой ячейке во всем столбце значениеj
, поэтому в конце концов все ячейки будут равны последнему значениюj
. Такаяlst
же длина, как у вашего фрейма данных?2. Я только что исправил отступ. И да, lst-это та же длина моего фрейма данных.
3. Есть ли какой-либо способ получить каждое значение из списка и добавить их в каждую строку в фрейме данных ?
4. Хорошо, тогда вместо той
for j in lst
части, которую вы можете просто сделатьdf['randColumn'] = lst
.5. Спасибо, он отлично работает на python, но когда я использую этот блокнот Databricks, в нем говорится, что объект «DataFrame» не поддерживает назначение элементов
Ответ №1:
Обновлено для корректной работы с любым типом столбцов в df.
Если я правильно понял ваш вопрос, вы можете использовать метод zip rdd для достижения своих целей.
from pyspark.sql import SparkSession, Row
import pyspark.sql.types as t
lst = []
for i in range(2):
rand_column = ''.join(random.choice(string.ascii_uppercase string.digits) for i in range(20))
# Adding random strings as Row to list
lst.append(Row(random=rand_column))
# Making rdd from random strings array
random_rdd = sparkSession.sparkContext.parallelize(lst)
res = df.rdd.zip(random_rdd).map(lambda rows: Row(**(rows[0].asDict()), **(rows[1].asDict()))).toDF()
Комментарии:
1. привет, Артем, я получаю эту ошибку, когда использовал ваш код в свойстве databricks, у объекта нет атрибута «распараллеливание», и каково значение *строк[0],*строк[1] в строке?
2. @RamandeepSingh Не могли бы вы показать вывод типа(spark_session.SparkContext)? *строки[0] означает распаковку значений из строки в качестве позиционных аргументов, и **(строки[0].asDict()) означает распаковку значений из строки в качестве именованных аргументов.
3. он показывает «Свойство» в качестве вывода типа(SparkSession.SparkContext)
4. Вам нужно вызвать sparcContext из вашего экземпляра SparkSession. Хм, прекрати. Вы используете spark или это фрейм данных pandas?
5. Я использую фрейм данных PySpark