2016-09-23 62 views
7

假设我有类似的数据到以下几点:如何通过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)所有行具有相同的值,在一个命令或几个命令的使用蟒蛇

考虑我们有许多类似于value,value2value3 ... value200的列。

输出:

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

你的意思是'df.drop_duplicates(subset = ['value','value2','value3'])'? – EdChum

+0

假设我们有很多列,如200 –

回答

13

我们所能做的是applynunique到calc下的DF唯一值的数量和落列其中只有一个独特的价值:

In [285]: 
cols = list(df) 
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 

另一个方式是只需要diff的数字列和sums即可:

In [298]: 
cols = df.select_dtypes([np.number]).columns 
diff = df[cols].diff().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 
+0

嗨感谢您的答案,但我的意思是,完全删除这些列只有所有其他行完好无损,并考虑大号。像值,值2 ...值200列,我也会更新问题。 –

+0

@ EdChum我更新了这个问题,你可以看一下吗? –

+0

好吧我明白你想要看什么更新 – EdChum

3

另一种解决方案是从列set_index未进行比较,然后通过eq所有DataFrame和最后使用boolean indexing通过比较选择iloc第一行:

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 
+0

我认为你的答案可以通过在我的答案中过滤掉非数字列来改善,因为OP的真实数据可能包含大量非数字列 – EdChum

+0

@EdChum - 是的,你是对的。 – jezrael

相关问题