2016-11-03 5 views
3

後ナンのを除去することにより、データフレーム内の行をマージします:それぞれの場合にのみ1非ナンがあることに注意してください、私は同じ外インデックス(と行をマージしたい次のようなデータフレームを付けGROUPBY

import numpy as np 
import pandas as pd 
from pandas import DataFrame 

idx = pd.MultiIndex.from_product([["Project 1", "Project 2"], range(1,3)], 
         names=['Project', 'Ord']) 
df = DataFrame({'a': ["foo", np.nan, np.nan, "bar"], 
       'b': [np.nan, "one", "two", np.nan]}, 
       index=idx) 

Out: 

       a b 
Project Ord   
Project 1 1 foo NaN 
      2 NaN one 
Project 2 1 NaN two 
      2 bar NaN 

を-値)。

私が持っている現在のソリューションは、2 GROUPBY-の操作が含まれます

df.index = df.index.droplevel(1) 
df.groupby(df.index).ffill().groupby(df.index).last() 

と私の意図した結果得られます。すべて私が必要とするので、

2 GROUPBYオペレーションを使用する必要が
Out: 
      a b 
Project    
Project 1 foo one 
Project 2 bar two 

は、過度のようですリストから単一のnon-nan値を返す集約関数です。しかし、私はdropnaを集合関数として使う方法を考えることはできません。

答えて

2

groupbylast方法は、最後の有効な値をつかみます。 firstはこの場合も同じことを達成します。

df.groupby(level='Project').last() 

​​

4

あなたはreset_indexstackunstackを使用することができます。

In [131]: df.reset_index(level=1, drop=True).stack().unstack() 
Out[131]: 
      a b 
Project 
Project 1 foo one 
Project 2 bar two 
関連する問題