n行ごとにパンダ


107

Dataframe.resample()は、timeseriesデータでのみ機能します。非時系列データからn行ごとに取得する方法が見つかりません。最良の方法は何ですか?

回答:


199

iloc整数の位置と通常のpython構文の両方に基づいて、行/列のスライスを取得するを使用します。

df.iloc[::5, :]

45
たとえば、5行ごとにしたいが、2行目からは、になりますdf.iloc[1::5, :]
リトルボビーテーブル

17
あなたは、列の一部を省略することができますdf.iloc[::5]
joctee

1
@chrisb開始行を指定するにはどうすればよいですか?2行目から始めて5行ごとに
FabioSpaghetti

30

@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列があることを前提としています。


6
(1)インデックスは数値である(2)ゼロから始まるインデックス(3)インデックス値は連続している...最後のインデックスは特に重要であるインデックスをリセットしないと、提案された方法を2回以上使用できないため
Constantine

1
私はあなたの主張を理解します。回答を編集して、仮定をより明確にします。
metastableB

1
@Constantineは、インデックスを追加するだけなので、他のソリューションよりも速くありませんか?
リーダー:

8

直接呼び出すことを含む、受け入れられた回答のさらに簡単な解決策があり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

1

同様の要件がありましたが、特定のグループのn番目の項目が必要でした。これは私がそれを解決した方法です。

groups = data.groupby(['group_key'])
selection = groups['index_col'].apply(lambda x: x % 3 == 0)
subset = data[selection]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.