我有一个数据框,其中各列之间有重复的值。我只想从数据框中删除所有列共有的值
输入数据帧:
+----------+-----------+------------+
| 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中有有效的方法吗?
答案 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 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