只使用一个不同的值快速删除数据框列

Ale*_*ont 9 python pandas

是否有更快的方法来删除仅包含一个不同于下面代码的值的列?

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和循环列的方法.

  • 我建议使用 .nunique() 如 /sf/answers/3808403721/ 中所述 (2认同)

kai*_*ait 6

一步:

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)


jz0*_*410 5

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)


Ben*_* JW 5

两个简单的单行代码,用于返回视图(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)