質問: df1 index x y z 1 x1 y1 z1 2 x2 y2 z2 ・ ・ ・ 300 x300 y300 z300 df2 index X Y Z 1 X1 Y1 Z1 2 X2 Y2 Z2 ・ ・ ・ 400 X400 Y400 Z400 とします。 df1の座標をdf2の座標に以下のルールで置換しようと考えております。 df1の3n+1行目→df2の4n行目 つまり x3n+1 y3n+1 z3n+1を X4n Y4n Z4nに全て置換したいのですが どのようにすればいいのかわかりません。 df1.ix[1:300:3,:]=df2.ix[4:400:4,:] のようにしますと3n+1行目に全てNanが表示されてしまいます。 まだまだ勉強不足で初歩的な質問だと思いますがよろしくお願いいたします。
回答: df1.ix[1:300:3,:]=df2.ix[4:400:4,:] の方法はdf1.ix側はdf2.ixの3n+1がないのでNanに、 df2.ix側にはdf1.ixの4nがないので代入されず結果df1.ixには3n+1と4nの公倍数のみdf2.ixが代入されることになります。 pandas.concatやmergeを使っていろいろTryしてみましたが 「df2側のindexをずらす」という要件があるので一発でできそうなコードは私にはできませんでした・・・ やるとすれば ・for文で素直に一つづつ代入 か ・あえてpandasの機能を使うことにこだわるとすれば df2.ixの4nを抽出し、3n+1でindexを振り直したものを生成 ↓ df1に代入 ``` #test用dataframe df1=pd.DataFrame(np.arange(300*3).reshape(300,3), index=np.arange(1,301,1), #indexは質問時にならい1開始 columns=list("xyz")) df2=pd.DataFrame(np.arange(10000,10000+400*3,1).reshape(400,3), index=np.arange(1,401,1), #indexは質問時にならい1開始 columns=list("xyz")) #本題 m4_df2=df2[0:400:4] #df2から4n部分を抽出 #配列添字の4n番目ということでやっていますが #indexの4nの時ということであるならば[3:400:4]としてください rem4_df2 = m4_df2.rename(index=lambda x:(x/4*3+1)) #4nを3n+1にindexを振り直し #つまり0→1 4→4 8→7 12→10... df1.ix[1:300:3]=rem4_df2 #こちらもindexが3n+1の時ではなく #配列添字が3n+1の時としていますがindex3n+1のときならば[0:300:3]としてください ``` 1行で書くと以下です。 ``` df1.ix[1:300:3] = df2[0:400:4].rename(index=lambda x:(x/4*3+1)) ```