2017-01-18 25 views
7

に一致するように再インデックスされます、私はエラーが発生しました方法です:ブールシリーズのキーは、ここでデータフレームインデックス

df.loc[a_list][df.a_col.isnull()] 

a_listのタイプはInt64Indexあり、それは行のインデックスのリストが含まれています。これらの行インデックスはすべてdfに属します。

df.a_col.isnull()部分は、フィルタリングに必要な条件です。

df.loc[a_list] 
df[df.a_col.isnull()] 

をしかし、私は一緒にdf.loc[a_list][df.a_col.isnull()]を入れた場合、私は、警告メッセージが表示されます(が、私は結果を見ることができます):私は個別に以下のコマンドを実行した場合

、私はすべての警告を得ることはありません

Boolean Series key will be reindexed to match DataFrame index

このエラーメッセージの意味はなんですか?それが返された結果に影響を及ぼしますか?

+0

これを実行してもまだそれを取得できますか? 'df.loc [a_list.tolist()]' – MYGz

+0

@MYGz質問を間違えて更新しました – Cheng

+1

何を達成しようとしていますか? 'df.loc [a_list]'は 'df.a_col.isnull()'と同じ長さにならないかもしれません。それはあなたがエラーを出している理由です。 – Psidom

答えて

13

あなたのアプローチは警告にもかかわらずうまくいきますが、暗黙的で不明確な動作に頼らざるを得ません。

溶液1a_listにブールマスク指標の選択を行う。

df[df.index.isin(a_list) & df.a_col.isnull()] 

溶液2は、二段階でそれを行う:

df2 = df.loc[a_list] 
df2[df2.a_col.isnull()] 

溶液3、 1つのライナーが必要な場合は、here

df.loc[a_list].query('a_col != a_col') 

警告がdf.loc[a_list]は、a_listの長さ、すなわち短いながら、ブールベクトルdf.a_col.isnull()は、dfの長さであるという事実から来ています。したがって、df.a_col.isnull()の一部のインデックスはdf.loc[a_list]にありません。パンダが何をするかは、呼び出し元のデータフレームと同じインデックス上のブールベクトルを再索引付けすることです。実際には、df.a_col.isnull()から、インデックスに対応する値はa_listになります。これは機能しますが、その動作は暗黙的なものであり、将来容易に変更される可能性があります。

+2

という行を見つけたが、何が原因なの? – Cheng

関連する問題