2017-10-18 101 views
2

我有一个df像这样的是约1000行:每7行,获得第n行熊猫

 0  1 
0 1.345 2.456 
1 2.123 3.564 
2 0.023 3.548 
3 3.457 2.456 
4 1.754 3.564 
5 0.905 3.548 
6 3.674 7.543 
7 9.443 6.4433... 

它的组织方式是每7行构成一个数据的“设置”(数据不能在这里排序)。在每一个“组”的7行我想要得到的第一行的,所以我的新的数据帧将如下所示:

 0  1 
0 1.345 2.456 
7 9.443 6.4433 

我可以解决它通过创建,通过重复1-7 &过滤新列只有列...

 0  1 groupby_col 
0 1.345 2.456  1 
1 2.123 3.564  2 
2 0.023 3.548  3 
3 3.457 2.456  4 
4 1.754 3.564  5 
5 0.905 3.548  6 
6 3.674 7.543  7 
7 9.443 6.4433  1... 

然后...

df[df['groupby_col'] == 1] 

有没有一种方法可以让我在大熊猫做到这一点,而无需创建一个额外的列然后过滤?

回答

5

选项1:

In [54]: df.iloc[::7] 
Out[54]: 
     0  1 
0 1.345 2.4560 
7 9.443 6.4433 

选项2:

In [53]: df.iloc[np.arange(len(df))%7==0] 
Out[53]: 
     0  1 
0 1.345 2.4560 
7 9.443 6.4433 
+0

通过一分钟打我!对于它的价值,你也可以使用df.ix [:: 7] – tnknepp

+1

@tnknepp,谢谢! '.ix []' - 在现代Pandas版本中被弃用 – MaxU

+1

不,谢谢你,我不知道.ix []已被弃用。我需要更新我的熊猫。你现在已经解决了你的帖子的两个问题。谢谢! – tnknepp

2
df.loc[df.index%7==0] 
Out[124]: 
     0  1 
0 1.345 2.4560 
7 9.443 6.4433 

或者

df.groupby(df.index//7,as_index=False).first() 
Out[128]: 
     0  1 
0 1.345 2.4560 
1 9.443 6.4433 
+0

这是一个有趣的做法。虽然它适用于OP的示例,但如果索引不是从0单调增加,它将不起作用。仍然有趣。 – tnknepp

+1

使用'groupby' - 是非常新鲜和不寻常的方法! +1 – MaxU

+1

@MaxU我不想使用'groupby'大声笑...但很难想你的盒子外面:-) – Wen