W pandach, jak podzielić serię/ramkę danych na dwie serie/DataFrame, gdzie dziwne wiersze w jednej serii, a nawet wiersze w różnych? W tej chwili używamPodziel ramkę danych na podstawie indeksu całkowitoliczbowego
To całkiem wolno.
W pandach, jak podzielić serię/ramkę danych na dwie serie/DataFrame, gdzie dziwne wiersze w jednej serii, a nawet wiersze w różnych? W tej chwili używamPodziel ramkę danych na podstawie indeksu całkowitoliczbowego
To całkiem wolno.
Zastosowanie slice:
In [11]: s = pd.Series([1,2,3,4])
In [12]: s.iloc[::2] # even
Out[12]:
0 1
2 3
dtype: int64
In [13]: s.iloc[1::2] # odd
Out[13]:
1 2
3 4
dtype: int64
Oto niektóre Porównania
In [100]: df = DataFrame(randn(100000,10))
prosta metoda (ale myślę, że zasięg sprawia, że ten powolny), ale będzie działać niezależnie od indeksu (np nie musi być numerem)
In [96]: %timeit df.iloc[range(0,len(df),2)]
10 loops, best of 3: 21.2 ms per loop
Następujące wymagają Int64Index
, który jest oparty na zakresie (który jest łatwy do uzyskania, tylko reset_index()
).
In [107]: %timeit df.iloc[(df.index % 2).astype(bool)]
100 loops, best of 3: 5.67 ms per loop
In [108]: %timeit df.loc[(df.index % 2).astype(bool)]
100 loops, best of 3: 5.48 ms per loop
upewnij się, aby nadać mu indeksach
In [98]: %timeit df.take(df.index % 2)
100 loops, best of 3: 3.06 ms per loop
same jak powyżej, ale bez konwersji na ujemnych indeksów
In [99]: %timeit df.take(df.index % 2,convert=False)
100 loops, best of 3: 2.44 ms per loop
to zwycięzca jest @AndyHayden Soln; działa to tylko na jednym typie dtype:
In [118]: %timeit DataFrame(df.values[::2],index=df.index[::2])
10000 loops, best of 3: 63.5 us per loop