Her n. Sıradaki pandalar


112

Dataframe.resample () yalnızca zaman serisi verileriyle çalışır. Zaman serisi olmayan verilerden her n'inci satırı almanın bir yolunu bulamıyorum. En iyi yöntem nedir?

Yanıtlar:


211

ilocHem tamsayı konumuna dayalı hem de normal python sözdizimini izleyen bir satır / sütun dilimi alan kullanırdım .

df.iloc[::5, :]

47
Örneğin, her beşinci sırayı isteyebilecek, ancak 2. sıradan başlayacak olanlar için df.iloc[1::5, :].
Little Bobby Tables

18
Sütun bölümünü atlayabilirsiniz:df.iloc[::5]
joctee

1
@chrisb başlangıç ​​satırını nasıl belirtebilirim? her 5 sıra gibi, ikinci sıradan başlayarak?
FabioSpaghetti

31

@ Chrisb'in kabul ettiği yanıt soruyu yanıtlasa da, buna şunu eklemek isterim.

nthVerileri almak veya nthsatırı bırakmak için kullandığım basit bir yöntem şudur:

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

Bu aritmetik tabanlı örnekleme, daha karmaşık satır seçimlerini mümkün kılma yeteneğine sahiptir.

Bu , elbette, 0'dan başlayan sıralı, ardışık, tam sayılardan oluşan bir sütununuz olduğunu varsayar .index


6
bu iyi bir cevap değildir çünkü genellikle karşılanmayan üç varsayımda bulunur: (1) indeks sayısaldır (2) sıfırdan başlayan indeks (3) indeks değerleri ardışıktır ... sonuncusu özellikle önemlidir endeksi sıfırlamadan önerilen yöntemi birden fazla kullanamayacağınız için
Constantine

1
Ben senin fikrini alıyorum. Varsayımları daha açık hale getirmek için yanıtı düzenleyecektir .
metastableB

1
@Constantine, sadece bir dizin ekleyebildiğiniz için diğer çözümden daha hızlı olmaz mıydı?
Okuyucu

8

Doğrudan başvurmayı içeren, kabul edilen yanıtın daha da basit bir çözümü var 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

Örneğin, her 2 satırı elde etmek için şunları yapabilirsiniz:

df[::2]

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

Ayrıca dizinde GroupBy.first/ GroupBy.headgrubu var:

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

İndeks, adımlara göre yere bölünür (bu durumda 2). Dizin sayısal değilse, bunun yerine yapın

# 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

Benzer bir gereksinimim vardı, ancak n'inci öğeyi belirli bir grupta istedim. Ben böyle çözdüm.

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

0

Dizini kullanırken bulduğum bir çözüm uygun değildi (muhtemelen multi-Gig .csv çok büyüktü veya çökmeden yeniden dizin oluşturmama izin verecek bazı teknikleri kaçırdım).
Her seferinde bir satır boyunca ilerleyin ve n'inci satırı yeni bir veri çerçevesine ekleyin.

import pandas as pd
from csv import DictReader

def make_downsampled_df(filename, interval):    
    with open(filename, 'r') as read_obj:
        csv_dict_reader = DictReader(read_obj)
        column_names = csv_dict_reader.fieldnames
        df = pd.DataFrame(columns=column_names)
    
        for index, row in enumerate(csv_dict_reader):
            if index % interval == 0:
               print(str(row))
               df = df.append(row, ignore_index=True)

    return df
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.