2013-02-20 14 views
7

pracuję poprzez przypisanie z Pand i używam np.where(), aby utworzyć dodać kolumny do Pandy DataFrame z trzech możliwych wartości:Pandy Kolumna Budowa z np.where()

fips_df['geog_type'] = np.where(fips_df.fips.str[-3:] != '000', 'county', np.where(fips_df.fips.str[:] == '00000', 'country', 'state')) 

Stan DataFrame po dodaniu kolumny wygląda następująco:

print fips_df[:5] 

    fips   geog_entity fips_prefix geog_type 
0 00000  UNITED STATES   00 country 
1 01000    ALABAMA   01  state 
2 01001 Autauga County, AL   01 county 
3 01003 Baldwin County, AL   01 county 
4 01005 Barbour County, AL   01 county 

Konstrukcja kolumny jest testowana przez dwa twierdzenia. Pierwsze podania i drugie zawiedzie.

## check the numbers of geog_type 

assert set(fips_df['geog_type'].value_counts().iteritems()) == set([('state', 51), ('country', 1), ('county', 3143)]) 

assert set(fips_df.geog_type.value_counts().iteritems()) == set([('state', 51), ('country', 1), ('county', 3143)]) 

Jaka jest różnica między wywołaniem kolumny jak fips_df.geog_type i fips_df [ „geog_type”], który powoduje mój drugi assert na niepowodzenie?

Odpowiedz

2

To powinny być takie same (i będzie przez większość czasu) ...

Jedna sytuacja nie jest, gdy masz już atrybutu lub metody określonej w tej wartości (w którym to przypadku wygrał „t być pominięte, a tym samym w kolumnie nie były dostępne z zapisem kropka)

In [1]: df = pd.DataFrame([[1, 2] ,[3 ,4]]) 

In [2]: df.A = 7 

In [3]: df.B = lambda: 42 

In [4]: df.columns = list('AB') 

In [5]: df.A 
Out[5]: 7 

In [6]: df.B() 
Out[6]: 42 

In [7]: df['A'] 
Out[7]: 
0 1 
1 3 
Name: A 

ciekawe, dot notation for accessing columns nie jest wymienione w selection syntax.

+1

http://pandas.pydata.org/pandas-docs/dev/dsintro.html#dataframe-column-attribute-access-and-ipython-completion –

+0

Dzięki! @andyhayden. Myślałem, że obie metody dostępu do kolumn są poprawne, chociaż nie widziałem tej części dokumentacji Pandy. Być może problem pochodzi z oświadczenia stwierdzenia – ajrenold

+0

@ajrenold mnie zbyt tbh, jest to jedyny sposób, jaki mogę wymyślić, może warto próbować potwierdzić df.A == df ['A']? –

3

Na wszelki wypadek można utworzyć nową kolumnę przy znacznie mniejszym wysiłku. Np .:

In [1]: import pandas as pd 

In [2]: import numpy as np 

In [3]: df = pd.DataFrame(np.random.uniform(size=10)) 

In [4]: df 
Out[4]: 
      0 
0 0.366489 
1 0.697744 
2 0.570066 
3 0.756647 
4 0.036149 
5 0.817588 
6 0.884244 
7 0.741609 
8 0.628303 
9 0.642807 

In [5]: categorize = lambda value: "ABC"[int(value > 0.3) + int(value > 0.6)] 

In [6]: df["new_col"] = df[0].apply(categorize) 

In [7]: df 
Out[7]: 
      0 new_col 
0 0.366489  B 
1 0.697744  C 
2 0.570066  B 
3 0.756647  C 
4 0.036149  A 
5 0.817588  C 
6 0.884244  C 
7 0.741609  C 
8 0.628303  C 
9 0.642807  C 
+0

To zdecydowanie lepszy sposób na wykonanie rzeczywistych obliczeń, notatka int nie jest potrzebna :) –

+0

@AndyHayden true, 'int' wkradł się podczas debugowania. –

+0

Dzięki za sugestię alternatywnego @MaximYegorushkin! Moja nowa kolumna fips ['geog_type'] jest tworzona w oparciu o ciąg liczb, gdzie wzorzec liczb umożliwia kategoryzację, ale nie wartość liczbową, więc nie jestem pewien, czy twoja metoda działałaby z łańcuchami. Zmieniłem moje pytanie i wstawiłem dane wyjściowe z DataFrame po utworzeniu nowej kolumny. – ajrenold

Powiązane problemy