簡體   English   中英

如何通過熊貓或火花數據框刪除所有行中具有相同值的列?

[英]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 )?

考慮我們有許多類似於valuevalue2value3 ... value200的列。

輸出:

   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]]

另一種解決方案是從未比較的列中設置iloc set_index eq選擇的第一行與所有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

選擇帶有布爾索引的列:

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

解決方案

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 ,它返回每列中唯一值的數量:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM