如何通过 pandas 或 spark 数据框删除所有行中具有相同值的列?

新手上路,请多包涵

假设我有类似于以下的数据:

   index id   name  value  value2  value3  data1  val5
    0  345  name1    1      99      23     3      66
    1   12  name2    1      99      23     2      66
    5    2  name6    1      99      23     7      66

我们如何删除所有这些列,如( valuevalue2value3 ),其中 python 中的所有命令行或一对命令具有相同的值?

考虑到我们有许多列与 valuevalue2 value3 value200

输出:

    index    id  name   data1
       0   345  name1    3
       1    12  name2    2
       5     2  name6    7

原文由 CYAN CEVI 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 630
2 个回答

我们可以做的是使用 nunique 计算数据框每一列中唯一值的数量,并删除只有一个唯一值的列:

 In [285]:
nunique = df.nunique()
cols_to_drop = nunique[nunique == 1].index
df.drop(cols_to_drop, axis=1)

Out[285]:
   index   id   name  data1
0      0  345  name1      3
1      1   12  name2      2
2      5    2  name6      7

另一种方法是仅 diff 数字列,采用 abs 值和 sums 它们:

 In [298]:
cols = df.select_dtypes([np.number]).columns
diff = df[cols].diff().abs().sum()
df.drop(diff[diff== 0].index, axis=1)
​
Out[298]:
   index   id   name  data1
0      0  345  name1      3
1      1   12  name2      2
2      5    2  name6      7

另一种方法是使用具有相同值的列的标准差将为零的属性:

 In [300]:
cols = df.select_dtypes([np.number]).columns
std = df[cols].std()
cols_to_drop = std[std==0].index
df.drop(cols_to_drop, axis=1)

Out[300]:
   index   id   name  data1
0      0  345  name1      3
1      1   12  name2      2
2      5    2  name6      7

实际上,上面的内容可以在一行中完成:

 In [306]:
df.drop(df.std()[(df.std() == 0)].index, axis=1)

Out[306]:
   index   id   name  data1
0      0  345  name1      3
1      1   12  name2      2
2      5    2  name6      7

原文由 EdChum 发布,翻译遵循 CC BY-SA 4.0 许可协议

一个简单的班轮(蟒蛇):

 df=df[[i for i in df if len(set(df[i]))>1]]

原文由 TBhavnani 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题