2016-05-27 9 views
1

のは、次のデータフレームがあるとしましょう:multiindex pandasデータフレームの行インデックス値に応じて列を作成する方法は?

ridx = pd.MultiIndex.from_tuples([('Tom','apple'),('Tom','banana'),('Anna','banana'),('Anna','citrus')], names=['basket', 'fruit']) 
df = pd.DataFrame({'Quantity' : [1, 2, 3, 4]}, index=ridx) 
df 

df

をそして、あなたはそれぞれの果実が持っているどのくらいの砂糖を教えてくれ辞書持っている:あなたが追加するにはどうすればよい

sugar_content = {'apple':3,'banana':10,'citrus':2} 

を「フルーツ」インデックスで指定されたフルーツの糖度を含むデータフレームへの新しい列?

答えて

1

ビットより高速な方法を:

In [58]: df['sugar_content'] = df.reset_index()['fruit'].map(sugar_content).to_frame().set_index(df.index) 

In [59]: df 
Out[59]: 
       Quantity sugar_content 
basket fruit 
Tom apple   1    3 
     banana   2    10 
Anna banana   3    10 
     citrus   4    2 

説明:

In [60]: df.reset_index()['fruit'].map(sugar_content) 
Out[60]: 
0  3 
1 10 
2 10 
3  2 
Name: fruit, dtype: int64 

In [61]: df.reset_index()['fruit'].map(sugar_content).to_frame() 
Out[61]: 
    fruit 
0  3 
1  10 
2  10 
3  2 

In [62]: df.reset_index()['fruit'].map(sugar_content).to_frame().set_index(df.index) 
Out[62]: 
       fruit 
basket fruit 
Tom apple  3 
     banana  10 
Anna banana  10 
     citrus  2 
0

あなたはdf.index.get_level_values()とインデックス値の配列を取得して、マップを実行するために、辞書のgetメソッドを介してnp.vectorize()を使用することができます。これを行うには

fruits = df.index.get_level_values('fruit').values 
fruits_sugar = np.vectorize(sugar_content.get)(fruits) # vectorize the get method of the dictionary and pass the sugar_content ndarray 
df['sugar per fruit'] = fruits_sugar 
df 

dataframe

関連する問題