基于整数索引分割数据帧

时间:2013-07-03 20:15:33

标签: pandas

在pandas中,如何将Series / dataframe拆分为两个Series / DataFrames,其中一个系列中的奇数行,甚至是不同的行?现在我正在使用

rng = range(0, n, 2)
odd_rows = df.iloc[rng]

这很慢。

2 个答案:

答案 0 :(得分:15)

使用切片:

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

答案 1 :(得分:3)

以下是一些比较

In [100]: df = DataFrame(randn(100000,10))

简单的方法(但我认为范围使得这很慢),但无论索引如何都会有效 (例如,不必是数字索引)

In [96]: %timeit df.iloc[range(0,len(df),2)]
10 loops, best of 3: 21.2 ms per loop

以下要求基于范围的Int64Index(很容易获得,只有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

确保给它指数位置

In [98]: %timeit df.take(df.index % 2)
100 loops, best of 3: 3.06 ms per loop

与上述相同,但没有关于负面指标的转换

In [99]: %timeit df.take(df.index % 2,convert=False)
100 loops, best of 3: 2.44 ms per loop

这位获胜者是@AndyHayden soln;这仅适用于单个dtype

In [118]: %timeit DataFrame(df.values[::2],index=df.index[::2])
10000 loops, best of 3: 63.5 us per loop