Получение того же значения из списка в столбце фрейма данных с помощью Python

#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