54257


以下のコードを実行すると前者は元のDataFrameを更新しますが、後者は更新されません。連続しないDataFrameの各要素を編集しやすい形に格納しなおして操作しようと思うのですが、良い方法はありますでしょうか？

[code]

    import pandas as pd
    
    df = pd.DataFrame( {'tag': ['A','B','A','B'], 'val': [1,2,3,4] }, index=range(1, 5) )
    df1 = df.ix[1:2]
    df1.is_copy = False
    df1.iloc[0] = 0 #この更新が元のDataFrameへ反映される（OK）
    df
    
    df = pd.DataFrame( {'tag': ['A','B','A','B'], 'val': [1,2,3,4] }, index=range(1, 5) )
    df2 = df.loc[ df["tag"]=="A" ]
    df2.is_copy = False
    df2.iloc[0] = 0 #この更新が元のDataFrameへ反映されない（NG）
    df
    
[/code]


CC BY-SA 3.0
2017-08-22T08:12:38.493
37400
2019-04-17T11:07:42.400
question
python pandas
連続しないDataFrameの要素を更新する方法は？


DataFrameのcopyにて編集を行った後に、`DataFrame.update()` にて書き戻す（上書きする）という方法はどうでしょうか。

[code]

    import pandas as pd
    
    df = pd.DataFrame( {'tag': ['A','B','A','B'], 'val': [1,2,3,4] }, index=range(1, 5) )
    df3 = df.loc[df["tag"]=="B"].copy()
    df3.iloc[0,1] = 0
    df.update(df3)
    df
    
[/code]


CC BY-SA 3.0
2017-08-22T09:56:49.877
37401
2017-08-22T09:56:49.877
24801
37400
answer


(コメントより)

index を使ってみてはどうでしょうか。

[code]

    idx = df.ix[df.tag == 'A'].index
    
[/code]

として

[code]

    df.ix[idx[0],:] = 0
    
[/code]


CC BY-SA 4.0
2019-04-17T11:07:42.400
54257
2019-04-17T11:07:42.400
754
37400
answer