[英]How to differenciate columns which are same in all rows from pandas dataframe?
[英]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
)?
考慮我們有許多類似於value
、 value2
、 value3
... 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.