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


395

なぜか知りたい 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のインデックス付け規則に準拠するのとています。単一の整数による行のインデックス付けをサポートしない設計上の理由はありますか?


4
df.ix[2]動作しません-少なくともではありませんpandas version '0.19.2'
Zahra

9
インデクシングオペレータを介して行と列の選択との間の差を確認するために、[]以下この回答を参照。また、絶対に使用.ixしないでください。非推奨
Ted Petrou 2017年

回答:


552

@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

[] (ラベルの位置によって)行のみをスライスします


7
2行目と3行目と4行目が必要な場合はどうしますか?
FaCoffee 2016年

1
インデクサーのリストを渡すだけです。ドキュメントは上記を指しています
Jeff

2
これらの名前を正当化する人はいますか?iloc行とlocラベルである理由がわからないので、これらを覚えるのは難しいと思います。
キロジュール2017

3
@kilojoules .ilocは、インデックス内の順序で物事を調べます(例:).iloc[[2]]は、の2番目の「行」ですdf。その行はたまたまインデックスの場所にあり4ます。 .locインデックス値で検索します。だから多分 "iloc"は "i"のようにA[i]?:)
ジムK.

1
@Jeff-これはうまく機能しますが、などのデータフレームから行を複製してdf.loc[-1] = df.iloc[[0]]挿入したい場合はどうなりますか?フレームには、エラーを示す追加のインデックス列が付属していますValueError: cannot set a row with mismatched columnsstackoverflow.com/questions/47340571/…を参照)
Growler

63

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

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

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


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

奇妙なことに、スライスが指定された場合、DataFrameインデックス付け演算子は行を選択し、整数の場所またはインデックスラベルによって選択できます。

df[2:3]

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

df[6:20:3]

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

明示的ではなく、ほとんど使用されていないため、インデックス付け演算子でこのスライス表記を使用することはほとんどありません。行ごとにスライスする場合は、を使用し.loc/.ilocます。


indxeing演算子を使用して行を別のデータフレームに追加しようとしましたが、他のデータフレームは空のままです。どうして?
FindOutIslamNow 2018

23

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

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

詳細については、ドキュメントをご覧ください。

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


ヒントありがとうございます。おかしい、この種のものは時々まだ質問パンダを作るものです。特定の状況での動作に例外を追加すると、私にとっては、少しの便宜のために一貫性を犠牲にするような気がします。
カールバーガー

15

pandasテーブルへのインデックスベースのアクセスを行うには、numpy.as_arrayオプションを使用して、テーブルをNumpy配列に変換することもできます。

np_df = df.as_matrix()

その後

np_df[i] 

うまくいくでしょう。


11
全体のデータフレームインデックスの目的及び他のすべてのパンダの提供を破ること
ファビオ・ディアス

6

ソースコードを見ることができます

DataFrameには_slice()スライスするプライベート関数があり、スライスする軸をDataFrameパラメータaxisが決定できるようにします。__getitem__()以下のためのDataFrame呼び出し中に軸を設定しません_slice()。したがって、_slice()スライスはデフォルトで軸0です。

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

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

5

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

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.