如何通过 pandas 或 spark 数据框删除所有行中具有相同值的列?
How to drop columns which have same values in all rows via pandas or 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
我们如何在使用 python?
考虑到我们有许多类似于 value
、value2
、value3
...value200
.
的列
输出:
index id name data1
0 345 name1 3
1 12 name2 2
5 2 name6 7
我们可以做的是使用nunique
计算dataframe每一列中唯一值的数量,并删除只有一个唯一值的列:
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
另一个解决方案是set_index
from column which are not compared and then compare first row selected by iloc
by eq
with all DataFrame
and last use 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
一个简单的衬里(python):
df=df[[i for i in df if len(set(df[i]))>1]]
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
您可以使用 nunique()
,其中 returns 每列中唯一值的数量:
df[df.columns[df.nunique() > 1]]
假设我有类似于以下的数据:
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
我们如何在使用 python?
考虑到我们有许多类似于 value
、value2
、value3
...value200
.
输出:
index id name data1
0 345 name1 3
1 12 name2 2
5 2 name6 7
我们可以做的是使用nunique
计算dataframe每一列中唯一值的数量,并删除只有一个唯一值的列:
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
另一个解决方案是set_index
from column which are not compared and then compare first row selected by iloc
by eq
with all DataFrame
and last use 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
一个简单的衬里(python):
df=df[[i for i in df if len(set(df[i]))>1]]
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
您可以使用 nunique()
,其中 returns 每列中唯一值的数量:
df[df.columns[df.nunique() > 1]]