Pandas保留每隔一行的组

3

假设我有一个像这样的pandas数据框:

    0   1   2
0   1   2   3
1   4   5   6
2   7   8   9
3  10  11  12
4  13  14  15
5  16  17  18

我希望保留每两行一组的数据,最终结果如下:

    0   1   2
0   1   2   3
1   4   5   6
4  13  14  15
5  16  17  18

我知道如何使用 df.iloc [:: 2] 获取交替行,但这给我带来了:
    0   1   2
0   1   2   3
2   7   8   9
4  13  14  15

希望有人能指点我正确的方向,不确定是否可以使用iloc来完成这个操作。如果有人能为我指点迷津,我将不胜感激。

2个回答

6

有很多方法可以做到这一点,其中一个是注意在4的重复模式中你想要前两个,即:

In [18]: df.loc[np.arange(len(df)) % 4 < 2]
Out[18]: 
    0   1   2
0   1   2   3
1   4   5   6
4  13  14  15
5  16  17  18

因为

In [19]: np.arange(len(df))
Out[19]: array([0, 1, 2, 3, 4, 5])

In [20]: np.arange(len(df)) % 4
Out[20]: array([0, 1, 2, 3, 0, 1])

In [21]: np.arange(len(df)) % 4 < 2
Out[21]: array([ True,  True, False, False,  True,  True], dtype=bool)

哇,太棒了,正是我想要的。如果我想以24个一组进行操作,那么我认为 %48 < 24 是正确的吗? - JSolomonCulp
1
没错!这也自然地适用于更复杂的情况。 - DSM

4

让我们来运用一点数学和布尔索引:

df[(df.index // 2 % 2) == 0]

输出:

    0   1   2
0   1   2   3
1   4   5   6
4  13  14  15
5  16  17  18

这个代码完全按照预期工作,如果我想用24组来做,我只需要将两个2替换为24吗? - JSolomonCulp
1
@JSolomonCulp df[(df.index // 24 % 2) == 0] - Scott Boston
我非常喜欢DSM解决方案的灵活性。df[(np.arange(len(df.index)) // 24 % 2) == 0] - Scott Boston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接