2017-07-08 29 views
8

Moja DataFrame ma ciąg w pierwszej kolumnie, a liczba w drugiej:muszę utworzyć obiekt listy Python, lub dowolny obiekt, spośród obiektu pandy DataFrame grupującego kawałki wartości z różnych rzędów

  GEOSTRING IDactivity 
9  wydm2p01uk0fd2z   2 
10 wydm86pg6r3jyrg   2 
11 wydm2p01uk0fd2z   2 
12 wydm80xfxm9j22v   2 
39 wydm9w92j538xze   4 
40 wydm8km72gbyuvf   4 
41 wydm86pg6r3jyrg   4 
42 wydm8mzt874p1v5   4 
43 wydm8mzmpz5gkt8   5 
44 wydm86pg6r3jyrg   5 
45 wydm8w1q8bjfpcj   5 
46 wydm8w1q8bjfpcj   5 

To, co chcę zrobić, to manipulować tą ramką DataFrame, aby obiekt listy zawierał ciąg znaków, utworzony z piątego znaku dla każdej wartości "GEOSTRING", dla każdej innej wartości "IDactivity". Więc w tym przypadku, mam 3 różne wartości „IDactivity”, a ja mam w mojej listy obiektu 3 ciągi, które wyglądają tak:

['2828', '9888','8888'] 

gdzie ponownie, symbole można zobaczyć w każdej struny, są Piąta wartość każdej wartości "GEOSTRING".

To, o co pytam, to rozwiązanie lub podejście, które nie wymaga zbyt skomplikowanej pętli for i jest tak wydajne, jak to tylko możliwe, ponieważ muszę manipulować dużą ilością danych. Chciałbym, żeby było czysto i szybko.

Mam nadzieję, że jest wystarczająco jasne.

Odpowiedz

9

to można łatwo zrobić w następujący sposób jako jednej liniowej: (uważany za dość szybko też)

result = df.groupby('IDactivity')['GEOSTRING'].apply(lambda x:''.join(x.str[4])).tolist() 

Ta grup dataframe przez wartości IDactivity następnie wybrać z każdego odpowiedniego ciąg GEOSTRING kolumnie 5th element (indeks 4) i łączy go z innymi odpowiednimi ciągami. Na koniec dodajemy metodę tolist(), aby uzyskać wyjście jako listę, która nie jest serią pand.

wyjściowa:

['2828', '9888', '8888'] 

Dokumentacja:

pandas.groupby
pandas.apply

1

Oto rozwiązanie obejmujące kolumnę temp, i wzorując się na kluczowej działalności z this answer:

# create a temp column with the character we want from each string 
dframe['Temp'] = dframe['GEOSTRING'].apply(lambda x: x[4]) 

# groupby ID and then concatenate using a sneaky call to .sum() 
dframe.groupby('IDactivity')['Temp'].sum().tolist() 

Wynik:

['2828', '9888', '8888'] 
+0

Jest to przydatne, ponieważ uczę się obsługiwać ramki danych. Odpowiedź Rayhane jest prawdopodobnie szybsza, ale i ty byłeś pomocny, dziękuję – zampero