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の索引付け規約と一致することを期待します。単一の整数による行のインデックス付けをサポートしないという設計上の理由はありますか?
@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
[]
は(ラベルの位置で)行のみをスライスします
[]
の主な目的は、列を選択することです。インデックス演算子に文字列または整数が渡されると、その特定の名前を持つ列を検索し、それをSeriesとして返します。
したがって、上記の質問では、df[2]
は、整数値2
に一致する列名を検索します。この列は存在せず、KeyError
が発生します。
不思議なことに、スライスが与えられると、DataFrameインデックス演算子が行を選択し、整数位置またはインデックスラベルによってそれを実行できます。
df[2:3]
最後の要素を除いて、これは整数位置2の行から3までスライスします。だから、単一行。次の例では、3行ごとに、整数位置6から最大20までの行を選択します。
df[6:20:3]
DataFrameインデックスに文字列が含まれている場合は、文字列ラベルで構成されるスライスを使用することもできます。詳細については、 .iloc vs .loc の解決策を参照してください。
このスライス表記法は、明示的ではなく、かつて使われたこともないので、インデックス演算子と一緒に使うことはほとんどありません。行単位でスライスする場合は、.loc/.iloc
を使用してください。
DataFrameはSeriesの辞書と考えることができます。 df[key]
はkey
によって列インデックスを選択しようとし、Seriesオブジェクトを返します。
ただし、[]の内側をスライスすると行がスライスされます。これは非常に一般的な操作だからです。
詳しくはこの文書を読むことができます。
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
Pandasテーブルへのインデックスベースのアクセスでは、テーブルをNumpy配列に変換する numpy.as_array オプションも検討できます。
np_df = df.as_matrix()
その後
np_df[i]
うまくいくでしょう。
ソースコード を見てください。
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)
このようにデータフレームをループすることができます。
for ad in range(1,dataframe_c.size):
print(dataframe_c.values[ad])