熊猫每隔n行


107

Dataframe.resample()仅适用于时间序列数据。我找不到从非时间序列数据中获取第n行的方法。最好的方法是什么?

Answers:


200

我会使用iloc,它根据整数位置并遵循常规python语法获取行/列切片。

df.iloc[::5, :]

46
例如,对于那些可能想要每隔第五行但从第二行开始的人来说,它将是df.iloc[1::5, :]
小鲍比表

17
您可以忽略该栏的一部分:df.iloc[::5]
joctee

1
@chrisb如何指定起始行?像从第二行开始的每5行一样?
FabioSpaghetti

30

尽管@chrisb接受的答案确实回答了该问题,但我想在此添加以下内容。

我用来获取nth数据或删除nth行的一种简单方法如下:

df1 = df[df.index % 3 != 0]  # Excludes every 3rd row starting from 0
df2 = df[df.index % 3 == 0]  # Selects every 3rd raw starting from 0

这种基于算术的采样具有实现甚至更复杂的行选择的能力。

当然,这假设您有一index列从0开始的有序,连续的整数


6
这不是一个好答案,因为做出了三个假设,而这三个假设经常不满足:(1)索引是数字的(2)索引从零开始的索引(3)索引值是连续的...最后一个尤为重要因为您不能不重新设置索引就多次使用建议的方法
君士坦丁堡

1
我明白你的意思。将编辑答案以使假设更加明确
metastableB

1
@Constantine仍然,那不会比其他解决方案要快,因为您只需添加索引即可?
雷德勒

8

对于接受的答案,有一个甚至更简单的解决方案,涉及直接调用df.__getitem__

df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

例如,要获取每2行,您可以执行

df[::2]

   a  b  c
0  x  x  x
2  x  x  x
4  x  x  x

还有GroupBy.first/ GroupBy.head,您对索引进行分组:

df.index // 2
# Int64Index([0, 0, 1, 1, 2], dtype='int64')

df.groupby(df.index // 2).first()
# Alternatively,
# df.groupby(df.index // 2).head(1)

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x

索引被步幅(在本例中为2)划分为底数。如果索引是非数字的,请执行

# df.groupby(np.arange(len(df)) // 2).first()
df.groupby(pd.RangeIndex(len(df)) // 2).first()

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x

1

我也有类似的要求,但我希望特定组中的第n个物品。这就是我解决的方法。

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.