Pyspark 删除数据框中的重复列
Pyspark remove duplicate columns in a dataframe
我发现很多解决方案都与 join
情况有关。我的问题是数据框本身是否存在重复项,如何检测和删除它们?以下示例只是展示了我如何创建具有重复列的数据框。
df = spark.createDataFrame([
(1, "A", "X1"),
(2, "B", "X2"),
(3, "B", "X3"),
], ["ID", "TYPE", "CODE"])
df1 = df.withColumn("TYPE1", df["TYPE"]).withColumn("TYPE2", df["TYPE"])
+---+----+----+
| ID|TYPE|CODE|
+---+----+----+
| 1| A| X1|
| 2| B| X2|
| 3| B| X3|
+---+----+----+
+---+----+----+-----+-----+
| ID|TYPE|CODE|TYPE1|TYPE2|
+---+----+----+-----+-----+
| 1| A| X1| A| A|
| 2| B| X2| B| B|
| 3| B| X3| B| B|
+---+----+----+-----+-----+
假设我刚刚得到 df1
,我怎样才能删除重复的列以获得 df
?谢谢!
您可以通过比较可能相同的列的所有唯一排列来删除重复的列。您可以使用 itertools
库和 combinations
来计算这些独特的排列:
from itertools import combinations
#select columns that can be identical, can also be a hardcoded list
L = filter(lambda x: 'TYPE' in x,df1.columns)
#we only want to do pairwise comparisons, so the second value of combinations is 2
permutations = [(map(str, comb)) for comb in combinations(L, 2)]
对于这些独特的排列中的每一个,您可以使用 filter
语句结合 count
.
来完全相同
columns_to_drop = set()
for permutation in permutations:
if df1.filter(df1[permutation[0]] != df1[permutation[1]]).count()==0:
columns_to_drop.add(permutation[1])
这将为您提供要删除的列的列表。然后,您可以使用以下列表推导来删除这些重复的列。
df.select([c for c in df.columns if c not in columns_to_drop]).show()
对于您的示例,这会产生以下输出:
+---+----+----+
| ID|TYPE|CODE|
+---+----+----+
| 1| A| X1|
| 2| B| X2|
| 3| B| X3|
+---+----+----+
我发现很多解决方案都与 join
情况有关。我的问题是数据框本身是否存在重复项,如何检测和删除它们?以下示例只是展示了我如何创建具有重复列的数据框。
df = spark.createDataFrame([
(1, "A", "X1"),
(2, "B", "X2"),
(3, "B", "X3"),
], ["ID", "TYPE", "CODE"])
df1 = df.withColumn("TYPE1", df["TYPE"]).withColumn("TYPE2", df["TYPE"])
+---+----+----+
| ID|TYPE|CODE|
+---+----+----+
| 1| A| X1|
| 2| B| X2|
| 3| B| X3|
+---+----+----+
+---+----+----+-----+-----+
| ID|TYPE|CODE|TYPE1|TYPE2|
+---+----+----+-----+-----+
| 1| A| X1| A| A|
| 2| B| X2| B| B|
| 3| B| X3| B| B|
+---+----+----+-----+-----+
假设我刚刚得到 df1
,我怎样才能删除重复的列以获得 df
?谢谢!
您可以通过比较可能相同的列的所有唯一排列来删除重复的列。您可以使用 itertools
库和 combinations
来计算这些独特的排列:
from itertools import combinations
#select columns that can be identical, can also be a hardcoded list
L = filter(lambda x: 'TYPE' in x,df1.columns)
#we only want to do pairwise comparisons, so the second value of combinations is 2
permutations = [(map(str, comb)) for comb in combinations(L, 2)]
对于这些独特的排列中的每一个,您可以使用 filter
语句结合 count
.
columns_to_drop = set()
for permutation in permutations:
if df1.filter(df1[permutation[0]] != df1[permutation[1]]).count()==0:
columns_to_drop.add(permutation[1])
这将为您提供要删除的列的列表。然后,您可以使用以下列表推导来删除这些重复的列。
df.select([c for c in df.columns if c not in columns_to_drop]).show()
对于您的示例,这会产生以下输出:
+---+----+----+
| ID|TYPE|CODE|
+---+----+----+
| 1| A| X1|
| 2| B| X2|
| 3| B| X3|
+---+----+----+