2017-10-18 129 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