web-dev-qa-db-ja.com

Pandas n行ごと

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

80
Mixel

ilocを使用します。これは、整数位置に基づいて、通常のpython構文に従う行/列スライスを取ります。

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

@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列があること。

18
metastableB

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
2
cs95

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

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