How to update values in a specific row in a Python Pandas DataFrame?

后端 未结 4 1245
猫巷女王i
猫巷女王i 2020-12-02 12:09

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 Da

相关标签:
4条回答
  • 2020-12-02 12:48

    If you have one large dataframe and only a few update values I would use apply like this:

    import pandas as pd
    
    df = pd.DataFrame({'filename' :  ['test0.dat', 'test2.dat'], 
                                      'm': [12, 13], 'n' : [None, None]})
    
    data = {'filename' :  'test2.dat', 'n':16}
    
    def update_vals(row, data=data):
        if row.filename == data['filename']:
            row.n = data['n']
        return row
    
    df.apply(update_vals, axis=1)
    
    0 讨论(0)
  • 2020-12-02 12:53

    Update null elements with value in the same location in other. Combines a DataFrame with other DataFrame using func to element-wise combine columns. The row and column indexes of the resulting DataFrame will be the union of the two.

    df1 = pd.DataFrame({'A': [None, 0], 'B': [None, 4]})
    df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})
    df1.combine_first(df2)
         A    B
    0  1.0  3.0
    1  0.0  4.0
    

    more information in this link

    0 讨论(0)
  • 2020-12-02 12:57

    There are probably a few ways to do this, but one approach would be to merge the two dataframes together on the filename/m column, then populate the column 'n' from the right dataframe if a match was found. The n_x, n_y in the code refer to the left/right dataframes in the merge.

    In[100] : df = pd.merge(df1, df2, how='left', on=['filename','m'])
    
    In[101] : df
    Out[101]: 
        filename   m   n_x  n_y
    0  test0.dat  12  None  NaN
    1  test2.dat  13  None   16
    
    In[102] : df['n'] = df['n_y'].fillna(df['n_x'])
    
    In[103] : df = df.drop(['n_x','n_y'], axis=1)
    
    In[104] : df
    Out[104]: 
        filename   m     n
    0  test0.dat  12  None
    1  test2.dat  13    16
    
    0 讨论(0)
  • 2020-12-02 13:04

    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 for some reason you are too lazy to 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
    
    0 讨论(0)
提交回复
热议问题