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

CYA*_*EVI 22 python duplicates multiple-columns pandas spark-dataframe

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

  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
Run Code Online (Sandbox Code Playgroud)

我们如何使用python在一个命令或几个命令中删除所有列(如value,value2(value3),所有行具有相同值的列)?

考虑到我们有类似的许多列value,value2,value3... value200.

输出:

   index id      name   data1
        0  345  name1    3
        1   12  name2    2
        5    2  name6    7
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 33

我们可以做的是apply nunique计算df中唯一值的数量并删除只有一个唯一值的列:

In [285]:
nunique = df.apply(pd.Series.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
Run Code Online (Sandbox Code Playgroud)

另一种方法是只diff使用数字列和abs它们:

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

实际上,上述内容可以单行完成:

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
Run Code Online (Sandbox Code Playgroud)


小智 5

一个简单的单线(python):

df=df[[i for i in df if len(set(df[i]))>1]]
Run Code Online (Sandbox Code Playgroud)