Dataframe.resample()は、時系列データでのみ機能します。非時系列データからn行ごとに取得する方法が見つかりません。最良の方法は何ですか?
iloc
を使用します。これは、整数位置に基づいて、通常のpython構文に従う行/列スライスを取ります。
df.iloc[::5, :]
@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
この算術ベースのサンプリングには、さらに複雑な行選択を可能にする機能があります。
この想定、もちろん、0から始まる順序付けられた連続した整数のindex
列があること。
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
たとえば、2行ごとに取得するには、次のようにします。
df[::2]
a b c
0 x x x
2 x x x
4 x x x
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
インデックスは、ストライドによってフロア分割されます(この場合は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
同様の要件がありましたが、特定のグループのn番目のアイテムが必要でした。これは私がそれを解決した方法です。
groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]