2016-09-23 17 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

相關問題