32286


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が表示されてしまいます。

まだまだ勉強不足で初歩的な質問だと思いますがよろしくお願いいたします。


CC BY-SA 3.0
2017-01-30T07:09:23.740
32249
2017-01-31T14:01:32.943
20448
question
python
pandasにおけるdataframe置換について


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に代入

[code]

    #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]としてください
    
[/code]

1行で書くと以下です。

[code]

    df1.ix[1:300:3] = df2[0:400:4].rename(index=lambda x:(x/4*3+1))
    
[/code]


CC BY-SA 3.0
2017-01-31T13:24:48.783
32286
2017-01-31T14:01:32.943
2017-01-31T14:01:32.943
19716
19716
32249
answer