熊猫每排第n行

Mix*_*xel 85 python resampling pandas

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

chr*_*isb 145

我使用iloc,它采用行/列切片,基于整数位置和遵循正常的python语法.

df.iloc[::5, :]
Run Code Online (Sandbox Code Playgroud)

  • 对于那些可能想要的人,例如,每五行,但从第二行开始,它将是`df.iloc [1 :: 5,:]`. (28认同)
  • 您可以省略列部分:`df.iloc [:: 5]` (11认同)
  • @banderlog013 不,这很直观 - 只需 `df.iloc[::3]` 就足够了。您想要的(“直观地”)是选择的第一行不是数据框中的第一行。不难看出,对于任何给定的 N(“给我从自然计数的第 N 行开始的 N 行”),索引是“df.iloc[(N-1)::N]”。这种行为很少需要,但是...... (3认同)
  • 怎么从后面把它包括进去? (2认同)

met*_*leB 22

虽然@ 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
Run Code Online (Sandbox Code Playgroud)

这种基于算术的采样能够实现更复杂的行选择.

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

  • 这不是一个好的答案,因为做了三个假设,经常不满足:(1)索引是数字(2)它从零开始的索引(3)索引值是连续的......最后一个是特别重要的因为在不重置索引的情况下,您不能多次使用建议的方法 (6认同)
  • 我接受你的观点。将编辑答案以使假设_更明确_。 (2认同)
  • @Constantine 仍然,这不是比其他解决方案更快吗,因为您可以简单地添加索引? (2认同)

cs9*_*s95 9

对于包含直接调用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
Run Code Online (Sandbox Code Playgroud)

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

df[::2]

   a  b  c
0  x  x  x
2  x  x  x
4  x  x  x
Run Code Online (Sandbox Code Playgroud)

还有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
Run Code Online (Sandbox Code Playgroud)

索引按步幅(在本例中为 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
Run Code Online (Sandbox Code Playgroud)


小智 8

添加reset_index()metastableB 的答案允许您只需要假设行是有序且连续的

df1 = df[df.reset_index().index % 3 != 0]  # Excludes every 3rd row starting from 0
df2 = df[df.reset_index().index % 3 == 0]  # Selects every 3rd row starting from 0
Run Code Online (Sandbox Code Playgroud)

df.reset_index().index将创建一个从 0 开始并以 1 递增的索引,使您可以轻松使用模数。