如何删除与python或pyspark中的顺序无关的列之间的重复值?

时间:2018-09-21 21:13:50

标签: python pandas pyspark

我有一个数据框,其中各列之间有重复的值。我只想从数据框中删除所有列共有的值

输入数据帧:

+----------+-----------+------------+
|    A     |    B      |   C        |
+----------+-----------+------------+
|  Food    |   Chill   |  Traveller |
+----------+-----------+------------+
|  Chill   |   Food    |  Chill     |
+----------+-----------+------------+
| Traveller|   Glamour |  Glamour   |
+----------+-----------+------------+
|  Novel   | Traveller |   Party    |
+----------+-----------+------------+
|  Pub     |   Party   |  Driving   |
+----------+-----------+------------+    

输出数据帧:

+----------+-----------+------------+
|    A     |    B      |   C        |
+----------+-----------+------------+
|  Food    |   Party   |  Driving   |
+----------+-----------+------------+
|  Novel   |   Food    |    Party   |
+----------+-----------+------------+
|   Pub    |   Glamour |  Glamour   |
+----------+-----------+------------+

在python或pyspark中有有效的方法吗?

2 个答案:

答案 0 :(得分:0)

“数据框”的概念是指采用数组形式的数据结构,其中列之间存在某种关系,行之间存在另一种关系。在这里,似乎没有任何关系:例如,“食物”,“聚会”和“驾驶”没有相互联系。因此:dataframe“概念的适用范围有限。您可以创建一个列表字典,如下所示:

common = [item for item in df['A'].values if all(item in df[col_name].values for col_name in df.columns)]
unique_elements = {col_name:[item for item in df[col_name].values if not item in common] for col_name in df.columns}

如果确实需要,可以使用unique_elements创建一个数据框。

请注意,也有set数据类型的解决方案,但这将消除多重性(尚不清楚您想要的是什么)。

答案 1 :(得分:0)

可以使用set intersectionaggregate

>>> tr = set(df.A.values) & set(df.B.values) & set(df.C.values)
>>> df[~df.isin(tr)].agg(lambda s: s[~pd.isnull(s)].values)

    A       B       C
0   Food    Food    Glamour
1   Novel   Glamour Party
2   Pub     Party   Driving