Перевод кадра данных со вторым кадром данных - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть два текстовых файла:

Один с переводами / псевдонимами в форме:

123 456
2 278
456 99999
...

и другой с тремя записями в строке:

34 456 9900
111 333 444
234 2 562
...

Я хочу перевести второй столбец, если это возможно, поэтому, например, я бы хотел, чтобы в выходном кадре данных были строки:

34, 99999, 9900
111, 333, 444
234, 278, 562

Чтение в текстовых файлах работает нормально. Тем не менее, у меня есть проблемы с переводом столбца б. Это моя основная структура кода прямо сейчас:

translation = sc.textFile("transl.txt")\
    .map(lambda line: line.split(" "))

def translate(string):
    x = translation.filter(lambda x: x[0] == string).collect()
    if x == []:
        return string
    return x[0][1]

d = sc.textFile("text.txt")\
    .map(lambda line: line.split(" "))\
    .toDF(["a", "b", "c"])\
    .withColumn("b", translate(d.b))\

Все отлично работает, кроме последней строки. Я знаю, что применение функций к столбцу в Spark не так легко, но я не знаю, как это сделать.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Этого можно добиться с помощью левого соединения . Пожалуйста, взгляните на код с комментариями ниже:

import pyspark.sql.functions as F

l1 = [
(123, 456)
,(2, 278)
,(456, 99999)
]

l2 = [
(34, 456, 9900)
,(111, 333, 444)
,(234, 2, 562)
]

df1=spark.createDataFrame(l1, ['one1', 'two1'])
df2=spark.createDataFrame(l2, ['one2', 'two2', 'three2'])

#creates an dataframe with five columns one1, two1, one2, two2, three2
df = df2.join(df1, df2.two2 == df1.one1 , 'left')

#checks if a value in your dictionary dataframe is avaiable, if not it will keep the current value
#otherwise the value will be translated
df = df.withColumn('two2', F.when(F.col('two1').isNull(), F.col('two2') ).otherwise(F.col('two1')))

df = df.drop('one1', 'two1')

df.show()

Вывод:

+----+-----+------+
|one2| two2|three2|
+----+-----+------+
| 111|  333|   444|
| 234|  278|   562|
|  34|99999|  9900|
+----+-----+------+
0 голосов
/ 03 ноября 2019

Немного другой подход заключается в объединении двух файлов, если вы импортировали их как кадры данных. Ниже приведен пример:

# Sample DataFrame's from provided example
import pandas as pd
translations = pd.DataFrame({
    'Key': [123,2,456],
    'Translation': [456,278,99999]
    })  

entries = pd.DataFrame({
    'A': [34,11,234],
    'B': [456,333,2],
    'C': [9900,444,562]
    })

После импорта файлов мы можем объединить их с помощью клавиш поиска, используя левое соединение

df = pd.merge(entries, translations, left_on='B', right_on='Key', how='left')

Однако это оставит нас сстолбцы с NaN, где поиск не может быть найден. Чтобы решить эту проблему, мы берем значение из «B» и в то же время перезаписываем исходный столбец «B» нашим поисковым значением.

df['B'] = df['Translation'].mask(pd.isna, df['B'])

Теперь нам нужно отбросить дополнительные столбцы, чтобы получитьрезультат, который вы запросили:

df.drop(columns=['Key', 'Translation'])

df теперь будет выглядеть так:

    A   B       C
0   34  99999   9900
1   11  333     444
2   234 278     562
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...