Pandas a cada enésima linha


108

Dataframe.resample () funciona apenas com dados de série temporal. Não consigo encontrar uma maneira de obter cada enésima linha de dados que não sejam da série temporal. Qual é o melhor método?

Respostas:


201

Eu usaria iloc, o que leva uma fatia de linha / coluna, com base na posição do inteiro e seguindo a sintaxe normal do Python.

df.iloc[::5, :]

46
Para quem pode querer, por exemplo, cada quinta linha, mas a partir da 2ª linha seria df.iloc[1::5, :].
Little Bobby Tables

17
Você pode omitir a parte da coluna:df.iloc[::5]
joctee

1
@chrisb como faço para especificar a linha inicial? como a cada 5 linhas, começando na segunda linha?
FabioSpaghetti

30

Embora a resposta aceita de @chrisb responda à pergunta, eu gostaria de acrescentar o seguinte.

Um método simples que uso para obter os nthdados ou eliminar a nthlinha é o seguinte:

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

Esta amostragem baseada em aritmética tem a capacidade de permitir seleções de linhas ainda mais complexas.

Isso pressupõe , é claro, que você tenha uma indexcoluna de inteiros ordenados e consecutivos começando em 0.


6
esta não é uma boa resposta porque faz três suposições, que frequentemente não são atendidas: (1) o índice é numérico (2) o índice começa em zero (3) os valores do índice são consecutivos ... a última é especialmente importante já que você não pode usar o método sugerido mais de uma vez sem redefinir o índice
Constantine

1
Eu entendi seu ponto. Editará a resposta para tornar as suposições mais explícitas .
metastableB

1
@Constantine ainda, isso não seria mais rápido do que a outra solução, já que você pode simplesmente adicionar um índice?
Readler

8

Existe uma solução ainda mais simples para a resposta aceita que envolve invocar diretamente 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

Por exemplo, para obter a cada 2 linhas, você pode fazer

df[::2]

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

Há também GroupBy.first/ GroupBy.head, você agrupa no índice:

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

O índice é dividido no solo pela passada (2, neste caso). Se o índice não for numérico, faça

# 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

Eu tinha um requisito semelhante, mas queria o enésimo item em um grupo específico. Foi assim que resolvi.

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.