使用for循环条件从多个PySpark数据框中获取唯一的列值

时间:2018-10-28 01:03:18

标签: python pandas dataframe pyspark pyspark-sql

我有2个PySpark数据帧(DF1DF2),并希望从colA的某些列(colBDF1)开始循环; colZ中的DF2)在两个数据帧中,并获得不同的值。

DF1:

colA colB colC
    1    1    A
    3    1    Y

DF2:

colX colY colZ
   1    1  A21
   3    4  Y33

输出:

column value
colA        1
colA        3
colB        1
colZ      A21
colZ      Y33

此方法有效,但是尝试创建for循环并收集所得的不同值无效。(因为我有50个以上的数据帧)

df_combined = DF1.select('colA').dropDuplicates(['colA']).withColumn("new_column",lit("colA")).union(DF1.select('colB').dropDuplicates(['colB']).withColumn("new_column", lit("colB"))).union(DF2.select('colZ').dropDuplicates(['colZ']).withColumn("new_column", lit("colZ")))

df_combined.withColumnRenamed("colA", "column").withColumnRenamed("new_column", "value").show()

1 个答案:

答案 0 :(得分:0)

对于您要在此处实现的目标,我还不太清楚,但这就是我会做到的方式。

import pandas as pd

DF1 = pd.DataFrame(data={'colA': [1, 3], 'colB': [1, 1], 'colC': ['A', 'Y']})
DF2 = pd.DataFrame(data={'colX': [1, 3], 'colY': [1, 4], 'colZ': ['A21', 'Y33']})

DF1 = DF1.stack().reset_index()[['level_1',0]].rename(columns={'level_1':'column',0:'value'}).drop_duplicates(subset=['column', 'value'])
def transformAndAppend(df):
    df = df.stack().reset_index()[['level_1', 0]].rename(columns={'level_1': 'column', 0: 'value'}).drop_duplicates(subset=['column', 'value'])
    return DF1.append(df)

DF1 = transformAndAppend(DF2)

DF1 = DF1.loc[(DF1['column'] == 'colA') | (DF1['column'] == 'colB') | (DF1['column'] == 'colZ')]
print(DF1)