2017-04-18 35 views
6

Mam dość dużą ramkę danych z pliku CSV w pandach.Jak zmodyfikować pełny tekst niektórych kolumn w pandach?

Problem polega na tym, że w niektórych kolumnach otrzymuję ciągi tekstu, które chciałbym wyizolować ostatnim znakiem, aby zamienić go w liczby całkowite.

Znalazłem rozwiązanie, ale jestem dość pewny, że nie jest najbardziej efektywny. To idzie tak:

import pandas as pd 

df = pd.read_csv("filename") 

cols = list(df.loc[:, 'col_a':'column_s']) 
df_filtered = df[cols].dropna() 

df_filtered['col_o'] = df_filtered['col_o'].str[-1:] 
df_filtered['col_p'] = df_filtered['col_p'].str[-1:] 
df_filtered['col_q'] = df_filtered['col_q'].str[-1:] 
df_filtered['col_r'] = df_filtered['col_r'].str[-1:] 
df_filtered['col_s'] = df_filtered['col_s'].str[-1:] 

chodzi o pisanie, to nie jest naprawdę skuteczny. Więc próbowałem coś takiego:

colstofilter = list(df_filtered.loc[:, 'col_o':'col_s']) 

for col in df_filtered[colstofilter]: 
    print(df_filtered[col].str[-1:].head()) 

Drukowanie daje dokładnie to, co chcę, ale gdy próbuję włączyć go do funkcji lub Lamba lub zastosować go do dataframe, pojawia się błąd, że jest to nieobsługiwane

Odpowiedz

3

Spróbuj tego:

df_filtered.loc[:, 'col_o':'col_s'] = \ 
    df_filtered.loc[:, 'col_o':'col_s'].apply(lambda x: x.str[-1]) 
+0

To działa jak urok! Wielkie dzięki ! –

1

rozważyć dataframe df

from string import ascii_lowercase 

df = pd.DataFrame(
    'ABC', list('xyz'), 
    list(ascii_lowercase[:10]) 
).add_prefix('col_') 

df 

    col_a col_b col_c col_d col_e col_f col_g col_h col_i col_j 
x ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC 
y ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC 
z ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC 

update + loc + stack/str/unstack
stack zrobić jedną serię tak możemy nazwać str tylko raz.
unstack, aby przywrócić go do ramki danych.
update zaktualizować df w miejscu

df.update(df.loc[:, 'col_d':'col_g'].stack().str[-1].unstack()) 

df 

    col_a col_b col_c col_d col_e col_f col_g col_h col_i col_j 
x ABC ABC ABC  C  C  C  C ABC ABC ABC 
y ABC ABC ABC  C  C  C  C ABC ABC ABC 
z ABC ABC ABC  C  C  C  C ABC ABC ABC