Pyspark тающие ноль колонны - PullRequest
0 голосов
/ 12 июня 2018

У меня есть кадр данных, который выглядит следующим образом:

# +----+------------+----------+-----------+
# | id |  c_type_1  | c_type_2 |  c_type_3 |
# +----+------------+----------+-----------+
# |  1 |    null    |   null   |     r     |
# |  2 |     a      |   null   |    null   |
# |  3 |    null    |   null   |    null   |
# +---+-------------+----------+-----------+

Мне нужно преобразовать его во что-то вроде этого:

# +----+------------+------------+
# | id |   c_type   | c_type_val |
# +----+------------+------------+
# |  1 |  c_type_3  |     r      |
# |  2 |  c_type_1  |     a      |
# |  3 |    null    |    null    |
# +---+-------------+------------+

Каждая строка имеет только одно значение c_type или всеЗначения c_type будут нулевыми.

В настоящее время я растапливаю строки следующим образом:

def melt(df, id_cols, value_cols, c_type, c_value):
    v_arr = []
    for c in value_cols:
        v_arr.append(struct(lit(c).alias(c_type), col(c).alias(c_value)))

    vars_and_vals = array(*v_arr)

    tmp = df.withColumn("vars_and_vals", explode(vars_and_vals))

    cols = id_cols + [
        col("vars_and_vals")[x].alias(x) for x in [c_type, c_value]]
    return tmp.select(*cols)


melted = melt(df, df.columns[:1], df.columns[1:4], 'c_type', 'c_type_val')

melted.filter(melted.c_type_val.isNotNull()).show()

Проблема состоит в том, что фильтрация нулевых значений для c_type_val отфильтровывает строку для id == 3(любые строки с нулевым c_type).Мне нужен способ плавления и фильтрации, чтобы сохранить третью строку с нулевым c_type и значением.

1 Ответ

0 голосов
/ 12 июня 2018

Я пытался использовать pandas, это может дать вам идею решить эту проблему,

temp=df.filter(like='c_type')
df= pd.merge(df,temp[temp.notnull()].stack().reset_index(), left_index=True, right_on=['level_0'],how='left')
df=df[['id','level_1',0]].reset_index(drop=True).rename(columns={'level_1':'c_type',0:'c_type_val'})
print df

Вывод:

   id    c_type c_type_val
0   1  c_type_3          r
1   2  c_type_1          a
2   3       NaN        NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...