2013-04-11 12 views
11

Mam dataframe pandy, który wygląda tak:Jak powielić wiersze w pand, w oparciu o pozycje na liście

COL  data 
line1 [A,B,C] 

gdzie elementy w kolumnie dane mogą być albo listy lub po prostu oddzielone przecinkami elementów . Czy istnieje łatwy drogi zdobycia:

COL  data 
line1 A 
line1 B 
line1 C 

mogę iteracyjne nad listy i ręcznie powielać wiersze pośrednictwem Python, ale jest tam jakiś magia pandy trick to robi? Kluczową kwestią jest automatyczne duplikowanie wierszy.

Dzięki!

Odpowiedz

6

Można napisać prostą funkcję czyszczącą, aby to lista (zakładając, że nie jest to lista przecinkami, a nie można po prostu użyć ast.literal_eval):

def clean_string_to_list(s): 
    return [c for c in s if c not in '[,]'] # you might need to catch errors 

df['data'] = df['data'].apply(clean_string_to_list) 

iteracja wierszy wydaje się uzasadnione wybór:

In [11]: pd.DataFrame([(row['COL'], d) 
         for d in row['data'] 
         for _, row in df.iterrows()], 
         columns=df.columns) 
Out[11]: 
    COL data 
0 line1 A 
1 line1 B 
2 line1 C 

Obawiam się, że nie sądzę pandy przeznaczony specjalnie dla tego rodzaju manipulacji.

+0

gdzie "pochodzą" i "wiersz [" COL '] "? –

+0

@AlexanderSupertramp wewnątrz listy zrozumienie 'dla _, wiersz w df.iterrows()'. _ Jest indeksem wiersza, wierszem jest rząd df jako seria. –

+4

To nie zadziałało jak napisałem; Musiałem zmienić dwa "dla": "[(wiersz [" COL '], d) dla _, wiersz w df.iterrows() dla d w wierszu ["dane"]] ". – RafG

Powiązane problemy