2017-12-14 3 views
1

2カラムインデックスを持つDataFrameがあるので、そのDataFrameから行をフィルタリングし、元のデータフレームのINDEX列のみを新しいフィルタリング済みのDataFrameに保存しようとしています。 パンダのマルチインデックスデータフレームでインデックス列のみを選択する方法は?

は私がしてCSVファイルからデータフレームを作成しました:CSVはその後 here

census_df = pd.read_csv("census.csv", index_col = ["STNAME", "CTYNAME"]) 
census_df.sort_index(ascending = True) 

ファイルを検索し、私は完全に正常に動作DATAFRAMEに何らかのフィルタリングを適用し、私は希望の行を取得します。私が使用するコードを以下に示す:ここ

def my_answer(): 

    mask1 = census_df["REGION"].between(1, 2) 
    mask2 = census_df.index.get_level_values("CTYNAME").str.startswith("Washington") 
    mask3 = (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"]) 
    new_df = census_df[mask1 & mask2 & mask3] 
    return pd.DataFrame(new_df.iloc[:, -1]) 

my_answer() 

が問題である。

上記のコードでは、インデックスと2つの索引列に加えて、最初の列とデータフレームを返します。私が望むのは、2つの指標列だけです。 したがって、最終回答では、 "STNAME"と "CTYNAME"という5行のDATAFRAMEが返されます。

+0

あなたは 'pd.DataFrame(new_dfを返す代わりにしたいです。 iloc [:, 0]) 'return new_df.reset_index()'を使用しますか? – jezrael

+0

@jezraelいいえ、動作しません。それは私が望まないすべての列を返します。私はちょうど列 "STNAME"と "CTYNAME"が欲しいです。また、私はそれらを列として望むだけではありません。私は彼らをあまりにも並べ替えの方法で表示したい。 –

答えて

0

あなたはDataFrameindexを変換することができます:

def my_answer(): 

    mask1 = census_df["REGION"].between(1, 2) 
    mask2 = census_df.index.get_level_values("CTYNAME").str.startswith("Washington") 
    mask3 = (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"]) 
    new_df = census_df[mask1 & mask2 & mask3] 
    return pd.DataFrame(new_df.index.tolist(), columns=['STNAME','CTYNAME']) 

print (my_answer()) 

     STNAME   CTYNAME 
0   Iowa Washington County 
1  Minnesota Washington County 
2 Pennsylvania Washington County 
3 Rhode Island Washington County 
4  Wisconsin Washington County 

MultiIndex必要MultiIndex.remove_unused_levelsとして出力をしたいが、それはpandas 0.20.0+で作業した場合:

def my_answer(): 

    mask1 = census_df["REGION"].between(1, 2) 
    mask2 = census_df.index.get_level_values("CTYNAME").str.startswith("Washington") 
    mask3 = (census_df["POPESTIMATE2015"] > census_df["POPESTIMATE2014"]) 
    new_df = census_df[mask1 & mask2 & mask3] 
    return new_df.index.remove_unused_levels() 

print (my_answer()) 

MultiIndex(levels=[['Iowa', 'Minnesota', 'Pennsylvania', 'Rhode Island', 'Wisconsin'], 
        ['Washington County']], 
      labels=[[0, 1, 2, 3, 4], [0, 0, 0, 0, 0]], 
      names=['STNAME', 'CTYNAME']) 
+0

AttributeError: 'MultiIndex'オブジェクトに 'to_frame'属性がありません –

+0

あなたが提案しているのは、私にとってはうまくいかないと思われるインデックスをリセットすることです。フレームのビューは私が望むようになりますが、出力は望ましくありません。 "STNAME"と "CTYNAME"という2つのエンティティをインデックスとしてではなく、列として使用します。 –

+0

@ArchanJoshi - パンダでは 'return pd.DataFrame(new_df.index.tolist()、columns = ['STNAME'、 'C​​TYNAME'])。to_string(index = False)'で可能ですが、dataframeを文字列。 – jezrael

関連する問題