/ / Najlepší spôsob, ako odstrániť stĺpce s jednou hodnotou z pandas dataframe - python, pandas

Najlepší spôsob, ako odstrániť stĺpce s jednou hodnotou z pandas dataframe - python, pandas

Snažím sa vytvoriť funkciu na odstránenie stĺpcov s jednou hodnotou z mojej sady údajov Použil som túto funkciu:

def oneCatElimination(dataframe):
columns=dataframe.columns.values
for column in columns:
if len(dataframe[column].value_counts().unique())==1:
del dataframe[column]
return dataframe

problémom je, že táto funkcia eliminuje dokonca stĺpec s viacerými odlišnými hodnotami, t.j. indexovým stĺpcom s celočíselným číslom.

odpovede:

3 pre odpoveď č. 1

Len

df.dropna(thresh=2, axis=1)

bude pracovať. Nie je potrebné nič iné. Uchováva všetky stĺpce s 2 alebo viacerými hodnotami, ktoré nie sú NA (kontrolované hodnotou prechádzajúcou na hodnotu thresh). axis kwarg vám umožní pracovať s riadkami alebo stĺpcami. Je to predvolené riadky, takže musíte prejsť axis=1 výslovne pracovať na stĺpcoch (zabudol som to v čase, keď som odpovedal, a preto je to editácia). vidieť dropna() Pre viac informácií.


1 pre odpoveď č. 2

Došlo k niekoľkým predpokladom:

  • Hodnoty Null / NA sa nepočítajú
  • Na udržanie stĺpca potrebujete viacero hodnôt, ktoré nie sú NA
  • Tieto hodnoty musia byť nejakým spôsobom odlišné (napr. Stĺpec plný 1 "s a iba 1" s by mal byť zrušený)

Všetko, čo povedal, by som použil a select vyhlásenie o stĺpcoch.

Ak začnete s týmto dátovým rámcom:

import pandas

N = 15
df = pandas.DataFrame(index=range(10), columns=list("ABCD"))
df.loc[2, "A"] = 23
df.loc[3, "B"] = 52
df.loc[4, "B"] = 36
df.loc[5, "C"] = 11
df.loc[6, "C"] = 11
df.loc[7, "D"] = 43
df.loc[8, "D"] = 63
df.loc[9, "D"] = 97

df

Čo vytvára:

     A    B    C    D
0  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN
2   23  NaN  NaN  NaN
3  NaN   52  NaN  NaN
4  NaN   36  NaN  NaN
5  NaN  NaN   11  NaN
6  NaN  NaN   11  NaN
7  NaN  NaN  NaN   43
8  NaN  NaN  NaN   63
9  NaN  NaN  NaN   97

Vzhľadom na vyššie uvedené predpoklady by mali byť stĺpce A a C zrušené, pretože A má iba jednu hodnotu a obe hodnoty C sú rovnaké. Potom môžete urobiť:

df.select(lambda c: df[c].dropna().unique().shape[0] > 1, axis=1)

A to mi dáva:

     B    D
0  NaN  NaN
1  NaN  NaN
2  NaN  NaN
3   52  NaN
4   36  NaN
5  NaN  NaN
6  NaN  NaN
7  NaN   43
8  NaN   63
9  NaN   97

0 pre odpoveď č. 3

To bude fungovať tak pre text, ako aj pre čísla:

for col in dataframe:
if(len(dataframe.loc[:,col].unique()) == 1):
dataframe.pop(col)

Poznámka: Týmto odstránite stĺpce, ktoré majú iba jednu hodnotu z pôvodného dátového rámca.