如何删除列之间的重复值,而不管它们在 python 或 pyspark 中的顺序如何?
Posted
技术标签:
【中文标题】如何删除列之间的重复值,而不管它们在 python 或 pyspark 中的顺序如何?【英文标题】:How to remove duplicate value among columns irresppective of their order in python or pyspark? 【发布时间】:2018-09-21 21:13:50 【问题描述】:我有一个数据框,其中列之间有重复值。我只想从数据框中删除所有列共有的值
输入数据帧:
+----------+-----------+------------+
| 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 中有没有有效的方法来做到这一点?
【问题讨论】:
如果您包含用于实例化数据框的代码会很好,这样我们在演示解决方案时就不必输入它。 可以做到,但这对于 spark 数据框来说并不是一个很好的用途。似乎每列一个数据框会更好。你想做什么?可能有更好的方法。 【参考方案1】:“数据框”的概念是指采用数组形式的数据结构,其中列之间存在某种关系,而行之间存在另一种关系。在这里,似乎没有跨行的关系:例如,“食物”、“聚会”和“驾驶”彼此没有联系。因此 :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
数据类型的解决方案,但这会消除多重性(不清楚您想要什么)。
【讨论】:
【参考方案2】:可以使用set intersection
和aggregate
>>> 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
【讨论】:
以上是关于如何删除列之间的重复值,而不管它们在 python 或 pyspark 中的顺序如何?的主要内容,如果未能解决你的问题,请参考以下文章