2017-05-11 13 views
1

行をループして変更されたデータフレームを返すことによって、関数を通じてデータフレームを修正しようとしました。以下のコードでは、関数 'test'にデータフレーム 'ding'を渡し、すべての行を繰り返して変更したデータフレームを返すことで、新しい列 'C'を作成します。私はtest_ding dfが3つの列を持つことを期待しましたが、2つの列しか見ることができませんでした。どんな助けも高く評価されます。関数内のすべての行をループすることによってデータフレームを変更する

P.S.これは、この小さなタスクを達成するために、他のより簡単な方法を持っている可能性がありますが、私は、行を反復するために探していますし、あなたが上set_valueを使用することができます

s1 = pd.Series([1,3,5,6,8,10,1,1,1,1,1,1]) 
s2 = pd.Series([4,5,6,8,10,1,7,1,6,5,4,3]) 

ding=pd.DataFrame({'A':s1,'B':s2}) 

def test(ding): 
    for index,row in ding.iterrows(): 
     row['C']=row.A+row.B 
return ding 

test_ding=test(ding) 

答えて

2

関数の外に反映されるようにデータフレーム上で行われた変更を見たいのですが元のデータフレームではなく、rowです。あなたはセルでの値のセルを設定したい場合はset_valuepretty fast次のとおりです。

def test(ding): 
    for index, row in ding.iterrows(): 
     ding.set_value(index, 'C', row.A+row.B) 
    return ding 
​ 
test_ding=test(ding) 

test_ding 
# A B C 
#0 1 4 5.0 
#1 3 5 8.0 
#2 5 6 11.0 
# ... 
+1

私も様々なdtypesを維持するためにitertupleをお勧めします。私は今は言うことができませんが、それは速いと思う。 – piRSquared

+0

私が掲示した方法で割り当てることができない理由は何ですか? 'row ['C'] = row.A + row.B' –

+0

'iterrows'はビューではないコピーを返すので、行に値を代入すると元のデータフレームに効果がありません。これはドキュメンテーションです**反復処理中のものは決して変更しないでください**。 これはすべての場合に機能するとは限りません。 データ型に応じて、イテレータはコピーではなくビューを返します。 を書き込むと効果はありません。 – Psidom

関連する問題