xkc*_*kcd 0 python dataframe pandas
我有一个Pandas DataFrame,其中一些列在每一行中都具有相同的值.
所以类似的东西: -
Col1 Col2 Col3 .... ColX ColY ColZ
323 False 324 4 abc Sync
232 False 342 4 def Sync
364 False 2343 4 ghi Sync
Run Code Online (Sandbox Code Playgroud)
所以我想从上面的DataFrame中删除Col2,ColX和ColZ.
您可以将DataFrame与特定行进行比较(我选择了第一行df.iloc[0])并使用它loc来选择满足您指定条件的列:
df.loc[:, ~(df == df.iloc[0]).all()]
Out:
Col1 Col3 ColY
0 323 324 abc
1 232 342 def
2 364 2343 ghi
Run Code Online (Sandbox Code Playgroud)
时序:
@ root的建议,nunique比将系列与单个值进行比较要快得多.除非你有大量的列(例如,数千个)迭代列,因为@MMF建议看起来像一种更有效的方法.
df = pd.concat([df]*10**5, ignore_index=True)
%timeit df.loc[:, ~(df == df.iloc[0]).all()]
1 loop, best of 3: 377 ms per loop
%timeit df[[col for col in df if not df[col].nunique()==1]]
10 loops, best of 3: 35.6 ms per loop
df = pd.concat([df]*10, axis=1, ignore_index=True)
%timeit df.loc[:, ~(df == df.iloc[0]).all()]
1 loop, best of 3: 3.71 s per loop
%timeit df[[col for col in df if not df[col].nunique()==1]]
1 loop, best of 3: 353 ms per loop
df = pd.concat([df]*3, axis=1, ignore_index=True)
%timeit df.loc[:, ~(df == df.iloc[0]).all()]
1 loop, best of 3: 11.3 s per loop
%timeit df[[col for col in df if not df[col].nunique()==1]]
1 loop, best of 3: 1.06 s per loop
Run Code Online (Sandbox Code Playgroud)
您还可以检查每列值生成的集合的长度:
df = df[[col for col in df if not len(set(df[col]))==1]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1771 次 |
| 最近记录: |