web-dev-qa-db-ja.com

整数インデックスによるパンダ系列/データフレームの行の選択

df[2]df.ix[2]が両方とも機能するのに、なぜdf[2:3]がサポートされていないのか興味があります。

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

私はdf[2]df[2:3]と同じように機能してPythonの索引付け規約と一致することを期待します。単一の整数による行のインデックス付けをサポートしないという設計上の理由はありますか?

324
user1642513

@HYRYをエコーし​​て、0.11の新しいドキュメントを参照

http://pandas.pydata.org/pandas-docs/stable/indexing.html

ここに新しい演算子があります。.ilocは整数インデックスのみをサポートし、.locはラベルインデックスのみをサポートします。

例えばこのシナリオを想像してください

In [1]: df = pd.DataFrame(np.random.Rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[]は(ラベルの位置で)行のみをスライスします

457
Jeff

DataFrameインデックス演算子[]の主な目的は、列を選択することです。

インデックス演算子に文字列または整数が渡されると、その特定の名前を持つ列を検索し、それをSeriesとして返します。

したがって、上記の質問では、df[2]は、整数値2に一致する列名を検索します。この列は存在せず、KeyErrorが発生します。


スライス表記が使用されている場合、DataFrameインデックス演算子は行を選択するように動作を完全に変更します。

不思議なことに、スライスが与えられると、DataFrameインデックス演算子が行を選択し、整数位置またはインデックスラベルによってそれを実行できます。

df[2:3]

最後の要素を除いて、これは整数位置2の行から3までスライスします。だから、単一行。次の例では、3行ごとに、整数位置6から最大20までの行を選択します。

df[6:20:3]

DataFrameインデックスに文字列が含まれている場合は、文字列ラベルで構成されるスライスを使用することもできます。詳細については、 .iloc vs .loc の解決策を参照してください。

このスライス表記法は、明示的ではなく、かつて使われたこともないので、インデックス演算子と一緒に使うことはほとんどありません。行単位でスライスする場合は、.loc/.ilocを使用してください。

42
Ted Petrou

DataFrameはSeriesの辞書と考えることができます。 df[key]keyによって列インデックスを選択しようとし、Seriesオブジェクトを返します。

ただし、[]の内側をスライスすると行がスライスされます。これは非常に一般的な操作だからです。

詳しくはこの文書を読むことができます。

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics

22
HYRY

Pandasテーブルへのインデックスベースのアクセスでは、テーブルをNumpy配列に変換する numpy.as_array オプションも検討できます。

np_df = df.as_matrix()

その後

np_df[i] 

うまくいくでしょう。

13
Pavel Prochazka

ソースコード を見てください。

DataFrameは、DataFrameをスライスするためのプライベート関数_slice()を持っています、そしてそれはパラメータaxisがどの軸をスライスするかを決定することを可能にします。 DataFrame__getitem__()は、_slice()の呼び出し中に軸を設定しません。そのため、_slice()はデフォルトで軸0をスライスします。

簡単な実験をすることができます、それはあなたを助けるかもしれません:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)
7
waitingkuo

このようにデータフレームをループすることができます。

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
6
user1401491