Эквивалентная маскировка панд и сдвиг в PySpark - PullRequest
0 голосов
/ 23 января 2019

Я собираю свое приложение на Python, но по какой-то причине мне нужно поместить его в распределенную среду, поэтому я пытаюсь собрать приложение

с использованием Spark, но не могу придумать кодтак же быстро, как shift в пандах.

enter image description here

mask = (df['name_x'].shift(0) == df['name_y'].shift(0)) & \ 
(df['age_x'].shift(0) == df['age_y'].shift(0))
df = df[~mask1]

Где

mask.tolist()                                               

дает

[True, False, True, False]

Конечный результат dfбудет содержать только две строки (2-й и 4-й).В основном пытается удалить строки, где [name_x, age_x] col дублируется, если присутствует в [name_y, age_y] col.

Выше код находится на кадре данных Pandas.Каким будет ближайший код PySpark, который настолько же эффективен, но не импортирует Pandas?

Я проверил Window на Spark, но не уверен в этом.

1 Ответ

0 голосов
/ 23 января 2019

shift не играет никакой роли в вашем коде. Это

import pandas as pd 

df = pd.DataFrame({
    "name_x" : ["ABC", "CDF", "DEW", "ABC"],
    "age_x": [20, 20, 22, 21],
    "name_y" : ["ABC", "CDF", "DEW", "ABC"],
    "age_y" : [20, 21, 22, 19],
})

mask1 = (df['name_x'].shift(0) == df['name_y'].shift(0)) & \
  (df['age_x'].shift(0) == df['age_y'].shift(0))
df[~mask1]

#  name_x  age_x name_y  age_y
# 1    CDF     20    CDF     21
# 3    ABC     21    ABC     19

эквивалентно

mask2 = (df['name_x'] == df['name_y']) & (df['age_x'] == df['age_y'])
df[~mask2]

#   name_x  age_x name_y  age_y
# 1    CDF     20    CDF     21
# 3    ABC     21    ABC     19

Поэтому все, что вам нужно, это фильтр:

sdf = spark.createDataFrame(df)

smask = ~((sdf["name_x"] == sdf["name_y"]) & (sdf["age_x"] == sdf["age_y"]))
sdf.filter(smask).show()
# +------+-----+------+-----+
# |name_x|age_x|name_y|age_y|
# +------+-----+------+-----+
# |   CDF|   20|   CDF|   21|
# |   ABC|   21|   ABC|   19|
# +------+-----+------+-----+

, который по законам де Моргана может быть упрощен до

(sdf["name_x"] != sdf["name_y"]) | (sdf["age_x"] != sdf["age_y"])

Как правило, shift можно выразить с помощью Оконные функции .

...