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:
iloc
Hem tamsayı konumuna dayalı hem de normal python sözdizimini izleyen bir satır / sütun dilimi alan kullanırdım .
df.iloc[::5, :]
df.iloc[::5]
@ Chrisb'in kabul ettiği yanıt soruyu yanıtlasa da, buna şunu eklemek isterim.
nth
Verileri almak veya nth
satı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
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.head
grubu 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
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
df.iloc[1::5, :]
.