Mam ramkę danych pand (X11) taką jak ta: w rzeczywistości mam 99 kolumn do dx99
dx1 dx2 dx3 dx4
0 25041 40391 5856 0
1 25041 40391 25081 5856
2 25041 40391 42822 0
3 25061 40391 0 0
4 25041 40391 0 5856
5 40391 25002 5856 3569
Chcę utworzyć dodatkowe kolumny dla wartości komórek, takich jak 25041, 40391,5856 itd. Więc będzie kolumna 25041 o wartości 1 lub 0, jeśli 25041 wystąpi w tym konkretnym wierszu w dowolnych kolumnach dxs. Używam tego kodu i działa, gdy liczba wierszy jest mniejsza.
mat = X11.as_matrix(columns=None)
values, counts = np.unique(mat.astype(str), return_counts=True)
for x in values:
X11[x] = X11.isin([x]).any(1).astype(int)
Otrzymuję taki wynik:
dx1 dx2 dx3 dx4 0 25002 25041 25061 25081 3569 40391 42822 5856
25041 40391 5856 0 0 0 1 0 0 0 1 0 1
25041 40391 25081 5856 0 0 1 0 1 0 1 0 1
25041 40391 42822 0 0 0 1 0 0 0 1 1 0
25061 40391 0 0 0 0 0 1 0 0 1 0 0
25041 40391 0 5856 0 0 1 0 0 0 1 0 1
40391 25002 5856 3569 0 1 0 0 0 1 1 0 1
Kiedy liczba rzędów wynosi wiele tysięcy lub milionów, zawiesza się i trwa wiecznie, a ja nie osiągam żadnych rezultatów. Proszę zauważyć, że wartości komórek nie są unikatowe dla kolumn, lecz powtarzają się w wielu kolumnach. Na przykład 40391 występuje w dx1, a także w dx2 itd. Dla 0 i 5856 itd. Jakiś pomysł, jak poprawić logikę wspomnianą powyżej?
python
data-cleaning
pandas
anaconda
Sanoj
źródło
źródło
Odpowiedzi:
W pandach jest o wiele więcej pythonowego rozwiązania ...
Zajmuje to mniej niż sekundę w 10 milionach wierszy na moim laptopie:
Oto przedstawione szczegóły:
Prosta mała ramka danych -
Metoda binaryzacji -
Ramka danych z 10 milionami wierszy -
Czasowa binaryzacja (inaczej kodowanie „na gorąco”) na 10 milionach ramek danych -
Mam nadzieję że to pomoże!
źródło
Wygląda na to, że chcesz utworzyć zmienną fikcyjną z kolumny ramki danych pandy. Na szczęście pandy mają specjalną metodę:
get_dummies()
. Oto fragment kodu, który możesz dostosować do swoich potrzeb:Oto wynik
data_transformed
:źródło