2015-03-28 9 views
19

Mam pd.DataFrame, który został utworzony przez parsowanie niektórych arkuszy Excel. Kolumna z pustymi komórkami. Na przykład poniżej podano dane wyjściowe dla częstotliwości tej kolumny, a rekordy 32320 mają brakujące wartości dla Najemcy.Pandas Pandas DataFrame usunąć Puste komórki

In [67]: value_counts(Tenant,normalize=False) 
    Out[67]: 
           32320 
    Thunderhead    8170 
    Big Data Others   5700 
    Cloud Cruiser    5700 
    Partnerpedia    5700 
    Comcast     5700 
    SDP      5700 
    Agora      5700 
    dtype: int64 

Próbuję upuścić wiersze gdzie brakuje najemcy, jednak opcja isnull nie rozpoznaje brakujących wartości.

In [71]: df['Tenant'].isnull().sum() 
    Out[71]: 0 

Kolumna ma typ danych "Obiekt". Co się dzieje w tym przypadku? Jak mogę usunąć zapisy, których brakuje najemcy?

Odpowiedz

40

Pandy rozpoznają wartość jako null, jeśli jest to obiekt np.nan, który zostanie wydrukowany jako NaN w ramce DataFrame. Twoje brakujące wartości to prawdopodobnie puste ciągi, których Pandas nie rozpoznaje jako puste. Aby to naprawić, możesz przekonwertować puste żądła (lub cokolwiek jest w pustych komórkach) na obiekty np.nan przy użyciu, a następnie wywołać dropna() w DataFrame, aby usunąć wiersze z zerowymi lokatorami.

Aby wykazać, tworzę DataFrame z jakimiś losowymi wartościami i niektórych pustych strun w kolumnie Tenants:

>>> import pandas as pd 
>>> import numpy as np 
>>> 
>>> df = pd.DataFrame(np.random.randn(10, 2), columns=list('AB')) 
>>> df['Tenant'] = np.random.choice(['Babar', 'Rataxes', ''], 10) 
>>> print df 

      A   B Tenant 
0 -0.588412 -1.179306 Babar 
1 -0.008562 0.725239   
2 0.282146 0.421721 Rataxes 
3 0.627611 -0.661126 Babar 
4 0.805304 -0.834214   
5 -0.514568 1.890647 Babar 
6 -1.188436 0.294792 Rataxes 
7 1.471766 -0.267807 Babar 
8 -1.730745 1.358165 Rataxes 
9 0.066946 0.375640   

Teraz zastępuje żadnych pustych strun w kolumnie Tenants z np.nan obiektów, tak jak poniżej:

>>> df['Tenant'].replace('', np.nan, inplace=True) 
>>> print df 

      A   B Tenant 
0 -0.588412 -1.179306 Babar 
1 -0.008562 0.725239  NaN 
2 0.282146 0.421721 Rataxes 
3 0.627611 -0.661126 Babar 
4 0.805304 -0.834214  NaN 
5 -0.514568 1.890647 Babar 
6 -1.188436 0.294792 Rataxes 
7 1.471766 -0.267807 Babar 
8 -1.730745 1.358165 Rataxes 
9 0.066946 0.375640  NaN 

teraz mogę upuść wartości null:

>>> df.dropna(subset=['Tenant'], inplace=True) 
>>> print df 

      A   B Tenant 
0 -0.588412 -1.179306 Babar 
2 0.282146 0.421721 Rataxes 
3 0.627611 -0.661126 Babar 
5 -0.514568 1.890647 Babar 
6 -1.188436 0.294792 Rataxes 
7 1.471766 -0.267807 Babar 
8 -1.730745 1.358165 Rataxes 
+0

dzięki dużo dam tego spróbować i dostać z powrotem! –

+1

@ mcmath, trochę ciekawy. Dlaczego importujesz numpy i używasz 'np.nan' kiedy możesz zrobić' pd.np.nan'? – propjk007

+2

@ propjk007, podobnie jak wiele rzeczy w życiu, istnieje wiele sposobów robienia wielu rzeczy – andrew

15

value_counts domyślnie pomija NaN, więc najprawdopodobniej masz do czynienia z "".

Więc może po prostu je odfiltrować jak

filter = df["Tenant"] != "" 
dfNew = df[filter] 
+0

dzięki bardzo! –

+0

@Bobs rozwiązanie nie działa dla mnie. df.dropna (podzbiór = ['najemca], inplace = True) działa. –

+1

Przepraszam za to. Myślałem, że masz do czynienia z "". Powinieneś opublikować swoje rozwiązanie jako odpowiedź –

1

Można użyć tej odmiany:

import pandas as pd 
vals = { 
    'name' : ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7'], 
    'gender' : ['m', 'f', 'f', 'f', 'f', 'c', 'c'], 
    'age' : [39, 12, 27, 13, 36, 29, 10], 
    'education' : ['ma', None, 'school', None, 'ba', None, None] 
} 
df_vals = pd.DataFrame(vals) #converting dict to dataframe 

wyjście to (** - podkreślanie tylko pożądanych wierszy):

age education gender name 
0 39  ma  m n1 ** 
1 12  None  f n2  
2 27 school  f n3 ** 
3 13  None  f n4 
4 36  ba  f n5 ** 
5 29  None  c n6 
6 10  None  c n7 

Aby zrzucić wszystko, co nie ma wartości "wykształcenia", użyj poniższego kodu:

df_vals = df_vals[~df_vals['education'].isnull()] 

('~' nie wskazuje)

Rezultat:

age education gender name 
0 39  ma  m n1 
2 27 school  f n3 
4 36  ba  f n5 
Powiązane problemy