2017-11-22 5 views
1

すべて、合体Pythonのパンダ用(SQL)機能

私はpandas documentationなどstackoverflowに「combine_first()」という関数を見つけることができました。これはほんの数例の論理的な例でうまくいく。私は以下のように "combine_first()"関数を複数回(この場合は6)組み合わせて動作させることができました。誰かがより洗練されたソリューションを見つけるのを助けることができますか?

作成された変数 "category_id"の結果には、最後の変数(category_id7)で始まり最初の値に上がる最初の欠損値が含まれている必要があります。 category_id(x)が設定されている場合、category_idはその値を取り、データフレーム内のすべての行の処理を停止する必要があります。

d={'category_id1':[32991,32991,32991,32991,32991], 
    'category_id2':[22,22,22,22,22], 
    'category_id3':[33058,51,121,120,32438], 
    'category_id4':[np.nan,np.nan,np.nan,np.nan,np.nan], 
    'category_id5':[np.nan,np.nan,np.nan,np.nan,np.nan], 
    'category_id6':[np.nan,np.nan,np.nan,np.nan,np.nan], 
    'category_id7':[np.nan,np.nan,np.nan,np.nan,np.nan] 
    } 
df=pd.DataFrame(data=d) 
df['category_id']=df.category_id7.combine_first(df.category_id6).combine_first(df.category_id5).combine_first(df.category_id4).combine_first(df.category_id3).combine_first(df.category_id2).combine_first(df.category_id1) 
print(df) 

答えて

1

あなたは背中からカスケードしようとしています。だから私はilocで列の順序を逆にします。私はpd.DataFrame.notnull()でそれに従って、どのセルがヌルでないかを特定します。後でpd.DataFrame.idxmaxを実行すると、各行の最初の非NULL値のすべての列名が後ろから検索されます。最後に、pd.DataFrame.lookupを使用して、検出された列に関連付けられた値を検索します。

df.assign(
    category_id=df.iloc[:, ::-1].notnull().idxmax(1).pipe(
     lambda d: df.lookup(d.index, d.values) 
    ) 
) 

    category_id1 category_id2 category_id3 category_id4 category_id5 category_id6 category_id7 category_id 
0   32991   22   33058   NaN   NaN   NaN   NaN  33058 
1   32991   22   51   NaN   NaN   NaN   NaN   51 
2   32991   22   121   NaN   NaN   NaN   NaN   121 
3   32991   22   120   NaN   NaN   NaN   NaN   120 
4   32991   22   32438   NaN   NaN   NaN   NaN  32438 
+0

私はすべての機能を完全に理解していませんが、完璧に機能します。とても有難い! – Kyle