是否有更快的方法来删除仅包含一个不同于下面代码的值的列?
cols=df.columns.tolist()
for col in cols:
if len(set(df[col].tolist()))<2:
df=df.drop(col, axis=1)
Run Code Online (Sandbox Code Playgroud)
这对于大型数据帧来说确实非常慢.从逻辑上讲,这会计算每列中的值的数量,实际上它可能在达到2个不同的值后停止计数.
Ana*_*mar 13
您可以使用Series.unique()方法查找列中的所有唯一元素,对于.unique()仅返回1元素的列,您可以删除它.示例 -
for col in df.columns:
if len(df[col].unique()) == 1:
df.drop(col,inplace=True,axis=1)
Run Code Online (Sandbox Code Playgroud)
一种不做就地丢弃的方法 -
res = df
for col in df.columns:
if len(df[col].unique()) == 1:
res = res.drop(col,axis=1)
Run Code Online (Sandbox Code Playgroud)
演示 -
In [154]: df = pd.DataFrame([[1,2,3],[1,3,3],[1,2,3]])
In [155]: for col in df.columns:
.....: if len(df[col].unique()) == 1:
.....: df.drop(col,inplace=True,axis=1)
.....:
In [156]: df
Out[156]:
1
0 2
1 3
2 2
Run Code Online (Sandbox Code Playgroud)
时间结果 -
In [166]: %paste
def func1(df):
res = df
for col in df.columns:
if len(df[col].unique()) == 1:
res = res.drop(col,axis=1)
return res
## -- End pasted text --
In [172]: df = pd.DataFrame({'a':1, 'b':np.arange(5), 'c':[0,0,2,2,2]})
In [178]: %timeit func1(df)
1000 loops, best of 3: 1.05 ms per loop
In [180]: %timeit df[df.apply(pd.Series.value_counts).dropna(thresh=2, axis=1).columns]
100 loops, best of 3: 8.81 ms per loop
In [181]: %timeit df.apply(pd.Series.value_counts).dropna(thresh=2, axis=1)
100 loops, best of 3: 5.81 ms per loop
Run Code Online (Sandbox Code Playgroud)
最快的方法似乎仍然是使用unique和循环列的方法.
df = df[[c for c
in list(df)
if len(df[c].unique()) > 1]]
Run Code Online (Sandbox Code Playgroud)
创建具有多个不同值的列名列表。
keep = [c for c
in list(df)
if len(df[c].unique()) > 1]
Run Code Online (Sandbox Code Playgroud)
删除不保留的列
df = df[keep]
Run Code Online (Sandbox Code Playgroud)
df.loc[:,df.apply(pd.Series.nunique) != 1]
Run Code Online (Sandbox Code Playgroud)
例如
In:
df = pd.DataFrame({'A': [10, 20, np.nan, 30], 'B': [10, np.nan, 10, 10]})
df.loc[:,df.apply(pd.Series.nunique) != 1]
Out:
A
0 10
1 20
2 NaN
3 30
Run Code Online (Sandbox Code Playgroud)
两个简单的单行代码,用于返回视图(jz0410 答案的较短版本)
df.loc[:,df.nunique()!=1]
Run Code Online (Sandbox Code Playgroud)
或原地放置(通过drop())
df.drop(columns=df.columns[df.nunique()==1], inplace=True)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7839 次 |
| 最近记录: |