["python","pandas"]
How to update values in a specific row in a Python Pandas DataFrame?

With the nice indexing methods in Pandas I have no problems extracting data in various ways. On the other hand I am still confused about how to change data in an existing DataFrame. In the following code I have two DataFrames and my goal is to update values in a specific row in the first df from values of the second df. How can I achieve this? import pandas as pd df = pd.DataFrame({'filename' : ['test0.dat', 'test2.dat'], 'm': [12, 13], 'n' : [None, None]}) df2 = pd.DataFrame({'filename' : 'test2.dat', 'n':16}, index=[0]) # this overwrites the first row but we want to update the second # df.update(df2) # this does not update anything df.loc[df.filename == 'test2.dat'].update(df2) print(df) gives filename m n 0 test0.dat 12 None 1 test2.dat 13 None [2 rows x 3 columns] but how can I achieve this: filename m n 0 test0.dat 12 None 1 test2.dat 13 16 [2 rows x 3 columns]
So first of all, pandas updates using the index. When an update command does not update anything, check both left-hand side and right-hand side. If you don't update the indices to follow your identification logic, you can do something along the lines of >>> df.loc[df.filename == 'test2.dat', 'n'] = df2[df2.filename == 'test2.dat'].loc[0]['n'] >>> df Out[331]: filename m n 0 test0.dat 12 None 1 test2.dat 13 16 If you want to do this for the whole table, I suggest a method I believe is superior to the previously mentioned ones: since your identifier is filename, set filename as your index, and then use update() as you wanted to. Both merge and the apply() approach contain unnecessary overhead: >>> df.set_index('filename', inplace=True) >>> df2.set_index('filename', inplace=True) >>> df.update(df2) >>> df Out[292]: m n filename test0.dat 12 None test2.dat 13 16