web-dev-qa-db-fra.com

Pandas tous les n rangs

Dataframe.resample () ne fonctionne qu'avec les données de séries chronologiques. Je n'arrive pas à trouver un moyen d'obtenir chaque nième ligne à partir de données non chronologiques. Quelle est la meilleure méthode?

61
Mixel

J'utiliserais iloc, qui prend une tranche ligne/colonne, toutes deux basées sur la position de l'entier et suivant la syntaxe python normale.

df.iloc[::5, :]
104
chrisb

Bien que la réponse acceptée de @ chrisb réponde à la question, j'aimerais ajouter ceci.

Une méthode simple que j'utilise pour obtenir les données nth ou supprimer la ligne nth est la suivante:

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

Cet échantillonnage basé sur l'arithmétique a la capacité d'activer des sélections de lignes encore plus complexes.

Ceci suppose , bien sûr, que vous avez une colonne index de ordonnés, consécutifs, entiers commençant à 0. 

12
metastableB

Il existe une solution encore plus simple à la réponse acceptée qui implique l’appel direct de 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

Par exemple, pour obtenir toutes les 2 lignes, vous pouvez faire

df[::2]

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

Il y a aussi GroupBy.first / GroupBy.head , votre groupe sur l'index:

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

L'indice est divisé par la foulée (2 dans le cas présent). Si l'index n'est pas numérique, faites plutôt

# 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
coldspeed

J'avais une exigence similaire, mais je voulais le nième élément d'un groupe particulier. Voici comment je l'ai résolu.

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
0
Steztric