2017-04-08 26 views
5

Hi Mam ramki danych tak:iteracyjnego niektórych kolumn w ramce danych

Ticker P/E  P/S  P/B P/FCF Dividend 
No.      
1 NTCT 457.32 3.03 1.44 26.04 - 
2 GWRE 416.06 9.80 5.33 45.62 - 
3 PEGA 129.02 4.41 9.85 285.10 0.28% 
4 BLKB 87.68 4.96 14.36 41.81 0.62% 

Po pierwsze, chcę przekonwertować wartości w kolumnach, które zawierają numery (które są obecnie ciąg) do wartości pływaka. Tak więc chciałbym mieć 4 środkowe kolumny, które wymagają konwersji do unoszenia się. Czy prosta pętla zadziała w tym przypadku?

Po drugie, jest problem z ostatnią kolumną 'Dividend', w której występuje wartość procentowa jako ciąg. W rzeczywistości mogę przekonwertować go na dziesiętne, jednak zastanawiałem się, czy istnieje sposób, aby nadal zachować% i wartości będą nadal możliwe do obliczenia.

Jakieś pomysły na te dwie kwestie?

+0

To znaczy, jeden ja usunięte? Tak, naprawiłem to i spytałem ponownie, ale i tak dostałem w dół, tak dobrze, że to się dzieje. –

Odpowiedz

2

Plan

  • Wyjąć 'Ticker' ponieważ nie jest numeryczny
  • użycie assign nadpisać Dividend przez striping off %
  • użytku apply z pd.to_numeric przekonwertować wszystkie kolumny
  • użyj eval, aby uzyskać Dividend do właściwego miejsca dziesiętnego


df[['Ticker']].join(
    df.assign(
     Dividend=df.Dividend.str.strip('%') 
    ).drop('Ticker', 1).apply(
     pd.to_numeric, errors='coerce' 
    ) 
).eval('Dividend = Dividend/100', inplace=False) 

    Ticker  P/E P/S P/B P/FCF Dividend 
No.            
1  NTCT 457.32 3.03 1.44 26.04  NaN 
2  GWRE 416.06 9.80 5.33 45.62  NaN 
3  PEGA 129.02 4.41 9.85 285.10 0.0028 
4  BLKB 87.68 4.96 14.36 41.81 0.0062 

więcej linii
bardziej czytelny

nums = df.drop('Ticker', 1).assign(Dividend=df.Dividend.str.strip('%')) 
nums = nums.apply(pd.to_numeric, errors='coerce') 
nums = nums.assign(Dividend=nums.Dividend/100) 
df[['Ticker']].join(nums) 

    Ticker  P/E P/S P/B P/FCF Dividend 
No.            
1  NTCT 457.32 3.03 1.44 26.04  NaN 
2  GWRE 416.06 9.80 5.33 45.62  NaN 
3  PEGA 129.02 4.41 9.85 285.10 0.0028 
4  BLKB 87.68 4.96 14.36 41.81 0.0062 
+0

Więc przeliczanie procentów na liczby dziesiętne jest jedynym sposobem, aby przejść w prawo? –

+0

@AlexT no! Po prostu jeszcze tego nie odkryłem. Aby to zrobić, należy utworzyć niestandardową klasę o nazwie procent, która dziedziczy po float, ale zastępujesz metodę __repr__. Problem polega na tym, że kiedy zrobiłem to panda lub numpy zamienia je z powrotem w pływaki. Ciekawi mnie, jak to zatrzymać. Chciałbym też z niego skorzystać. Jeszcze się nie domyśliłem. – piRSquared

+0

Czy sądzisz, że ustawienie formatu wyświetlania pływającego na ten rozwiąże problem? 'pd.options.display.float_format = '{: .2f}%'. format' Należy jednak stosować tylko do jednej kolumny: / –

1

Zakładając, że wszystkie P/... kolumny zawierają odpowiednie liczby:

In [47]: df.assign(Dividend=pd.to_numeric(df.Dividend.str.replace(r'\%',''), errors='coerce') 
    ...:      .div(100)) \ 
    ...: .set_index('Ticker', append=True) \ 
    ...: .astype('float') \ 
    ...: .reset_index('Ticker') 
    ...: 
Out[47]: 
    Ticker  P/E P/S P/B P/FCF Dividend 
No. 
1  NTCT 457.32 3.03 1.44 26.04  NaN 
2  GWRE 416.06 9.80 5.33 45.62  NaN 
3  PEGA 129.02 4.41 9.85 285.10 0.0028 
4  BLKB 87.68 4.96 14.36 41.81 0.0062