Разделение фрейма данных по условиям в pySpark - PullRequest
1 голос
/ 07 мая 2020

У меня фрейм данных имеет значение false, true, или null. Я хочу создать два фрейма данных: 1) только с именами столбцов True и 2) только с именами столбцов False. Мои первоначальные мысли - создать два фрейма данных (поскольку позже они будут добавлены к большему набору данных) или я также подумал о преобразовании соответствующих имен столбцов в список, а затем имен списков в имена столбцов.

Я новичок в pySpark и пытаюсь понять, как это сделать без жесткого кодирования имен столбцов (у меня есть пара сотен столбцов). Я знаю, что я не могу выполнять итерацию по строкам, поскольку это нарушит цель pySpark.

Каждый столбец будет иметь только одно логическое значение - либо T, либо F, следовательно, несколько нулей на столбец. Я попытался использовать .filter, но он отфильтровал только один столбец и фактически напечатал все остальные столбцы, а не только столбцы F.

df.filter(df.col1 == 'F').show() 
df:
+----+----+----+----+-----+
|Name|col1|col2|col3|col4 |
+----+----+----+----+-----+
|   A|null|  F | T  |null |
|   A| F  |null|null|null |
|   E|null|null|null|  T  |
+----+----+----+----+-----+


EXPECTED OUTCOME

Dataframe w/ True Column Names:
+------+----+
|col3  |col4|
+------+----+

Dataframe w/ False Column Names (empty dataframe)
+------+----+
|col1  |col2|
+------+----+

Ответы [ 2 ]

4 голосов
/ 07 мая 2020

Вы можете взять first каждой строки с помощью ignorenulls=True и преобразовать в словарь;

import pyspark.sql.functions as F
r = df.select(*[F.first(i,ignorenulls=True).alias(i) for i in df.columns]).collect()

T = [k for k,v in r[0].asDict().items() if v=='T']
F = [k for k,v in r[0].asDict().items() if v=='F']

print(T)
print(F)

#['col3', 'col4']
#['col1', 'col2']
1 голос
/ 07 мая 2020

Это должно сработать:

import pandas as pd

#get list of columns
dfListCols = df.columns.tolist()
#remove first column 'name'
dfListCols.pop(0)
#create lists for T/F
truesList = list()
falseList = list()
#loop over columns 
for col in dfListCols:
    #subframe with the current column
    tempDf = df[col]
    #check if contains T
    if 'T' in tempDf.values:
        #if yes add to truesList
        truesList.append(col)
    else:
        #if no add to falseList
        falseList.append(col)

#get subDFrames
trueDF = df[truesList]
falseDF = df[falseList]
...