Python 用第二个数据帧转换数据帧

Python 用第二个数据帧转换数据帧,python,dataframe,apache-spark,pyspark,Python,Dataframe,Apache Spark,Pyspark,我有两个文本文件: 一个具有以下格式的翻译/别名: 123 456 2 278 456 99999 ... 还有一个每行有三个条目: 34 456 9900 111 333 444 234 2 562 ... 如果可能的话,我想转换第二列,因此,例如,我希望输出数据帧具有以下行: 34, 99999, 9900 111, 333, 444 234, 278, 562 阅读文本文件效果很好。然而,我在翻译b栏时确实有问题。 这是我现在的基本代码结构: translation=sc.textF

我有两个文本文件:

一个具有以下格式的翻译/别名:

123 456
2 278
456 99999
...
还有一个每行有三个条目:

34 456 9900
111 333 444
234 2 562
...
如果可能的话,我想转换第二列,因此,例如,我希望输出数据帧具有以下行:

34, 99999, 9900
111, 333, 444
234, 278, 562
阅读文本文件效果很好。然而,我在翻译b栏时确实有问题。 这是我现在的基本代码结构:

translation=sc.textFile(“transl.txt”)\
.map(lambda行:line.split(“”)
def翻译(字符串):
x=translation.filter(lambda x:x[0]==string).collect()
如果x=[]:
返回字符串
返回x[0][1]
d=sc.textFile(“text.txt”)\
.map(lambda行:line.split(“”)\
.toDF([“a”、“b”、“c”])\
.带栏(“b”,翻译(d.b))\
除了最后一行,一切都很好。
我知道将函数应用到spark中的列并没有那么容易,但是我不知道如何做。

稍微不同的方法是将两个文件连接起来,如果将它们作为数据帧导入。我在下面展示了一个示例:

# 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

你可以用一个简单的方法来实现这一点。请查看下面的注释代码:

导入pyspark.sql.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'])
#创建包含五列的数据框one1、two1、one2、two2、three2
df=df2.join(df1,df2.two2==df1.one1,‘左’)
#检查字典数据框中的值是否可用,如果不可用,它将保留当前值
#否则将转换该值
df=df.withColumn('two2',F.when(F.col('two1')).isNull(),F.col('two2')。否则(F.col('two1'))
df=df.drop('one1','two1')
df.show()
输出:

+----+-----+------+
|一个2 |两个2 |三个2|
+----+-----+------+
| 111|  333|   444|
| 234|  278|   562|
|  34|99999|  9900|
+----+-----+------+

感谢您的回答,但我正在寻找一种使用pyspark数据帧而不是熊猫的解决方案。