如何通过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

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

考虑我们有许多列类似于value, value2, value3value200 .

输出:

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

我们可以做的是使用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

一个简单的一行(python):

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

另一种解决方案是set_index从未比较的列,然后比较iloceq选择的第一行与所有DataFrame和最后使用boolean indexing:

df1 = df.set_index(['index','id','name',])
print (~df1.eq(df1.iloc[0]).all())
value     False
value2    False
value3    False
data1      True
val5      False
dtype: bool
print (df1.ix[:, (~df1.eq(df1.iloc[0]).all())].reset_index())
   index   id   name  data1
0      0  345  name1      3
1      1   12  name2      2
2      5    2  name6      7

您可以使用nunique,它返回每列中唯一值的数量:

In [3]: df.loc[:, df.nunique() > 1]
Out[3]: 
   index   id   name  data1
0      0  345  name1      3
1      1   12  name2      2
2      5    2  name6      7

python解

原始数据帧

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
解决方案

for col in df.columns:  # Loop through columns
  if len(df[col].unique()) == 1:  # Find unique values in column along with their length and if len is == 1 then it contains same values
    df.drop([col], axis=1, inplace=True)  # Drop the column

执行以上代码后的数据帧

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

这应该也可以:

cols_to_drop  = []
for col in df:
    if df[col].std()==0:
        cols_to_drop.append(col)
df= df.drop(columns = cols_to_drop)

相关内容

  • 没有找到相关文章

最新更新