我一直在Python上构建应用程序,但由于某种原因,我需要将其放在分布式环境中,因此我正在尝试构建和应用程序
使用Spark,但在Pandas中无法提供与shift
一样快的代码。
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
将仅包含两行(第二和第四行)。
基本上是尝试删除[name_y,age_y] col上存在[name_x,age_x] col重复的行。
以上代码位于Pandas数据框上。效率最高但不导入Pandas的最接近的PySpark代码是什么?
我在Spark上检查了Window
,但不确定。
答案 0 :(得分:1)
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|
# +------+-----+------+-----+
根据De Morgan的定律,可以简化为
(sdf["name_x"] != sdf["name_y"]) | (sdf["age_x"] != sdf["age_y"])
通常,shift
可以用Window functions表示。