Christian Rueda
Christian Rueda

Reputation: 75

How to update several DataFrames values with another DataFrame values?

Please would you like to know how I can update two DataFrames df1 y df2 from another DataFrame df3. All this is done within a for loop that iterates over all the elements of the DataFrame df3

for i in range(len(df3)):
   df1.p_mw = ...
   df2.p_mw = ...

The initial DataFrames df1 and df2 are as follows:

df1 = pd.DataFrame([['GH_1', 10, 'Hidro'],
                    ['GH_2', 20, 'Hidro'],
                    ['GH_3', 30, 'Hidro']],
                    columns= ['name','p_mw','type'])

df2 = pd.DataFrame([['GT_1', 40, 'Termo'],
                    ['GT_2', 50, 'Termo'],
                    ['GF_1', 10, 'Fict']],
                    columns= ['name','p_mw','type'])

The DataFrame from which I want to update the data is:

df3 = pd.DataFrame([[150,57,110,20,10],
                    [120,66,110,20,0],
                    [90,40,105,20,0],
                    [60,40,90,20,0]],
                    columns= ['GH_1', 'GH_2', 'GH_3', 'GT_1', 'GT_2'])

As you can see the DataFrame df3 contains data from the corresponding column p_mw for both DataFrames df1 and df2. Furthermore, the DataFrame df2 has an element named GF_1 for which there is no update and should remain the same.

After updating for the last iteration, the desired output is the following:

df1 = pd.DataFrame([['GH_1', 60, 'Hidro'],
                    ['GH_2', 40, 'Hidro'],
                    ['GH_3', 90, 'Hidro']],
                    columns= ['name','p_mw','type'])

df2 = pd.DataFrame([['GT_1', 20, 'Termo'],
                    ['GT_2', 0, 'Termo'],
                    ['GF_1', 10, 'Fict']],
                    columns= ['name','p_mw','type'])

Upvotes: 1

Views: 197

Answers (2)

Shubham Sharma
Shubham Sharma

Reputation: 71689

Create a mapping series by selecting the last row from df3, then map it on the column name and fill the nan values using the values from p_mw column

s = df3.iloc[-1]

df1['p_mw'] = df1['name'].map(s).fillna(df1['p_mw'])
df2['p_mw'] = df2['name'].map(s).fillna(df2['p_mw'])

If there are multiple dataframes that needed to be updated then we can use a for loop to avoid repetition of our code:

for df in (df1, df2):
    df['p_mw'] = df['name'].map(s).fillna(df['p_mw'])

>>> df1

   name  p_mw   type
0  GH_1    60  Hidro
1  GH_2    40  Hidro
2  GH_3    90  Hidro

>>> df2
   name  p_mw   type
0  GT_1  20.0  Termo
1  GT_2   0.0  Termo
2  GF_1  10.0   Fict

Upvotes: 1

user10343540
user10343540

Reputation:

This should do as you ask. No need for a for loop.

df1 = pd.DataFrame([['GH_1', 10, 'Hidro'],
                    ['GH_2', 20, 'Hidro'],
                    ['GH_3', 30, 'Hidro']],
                    columns= ['name','p_mw','type'])

df2 = pd.DataFrame([['GT_1', 40, 'Termo'],
                    ['GT_2', 50, 'Termo'],
                    ['GF_1', 10, 'Fict']],
                    columns= ['name','p_mw','type'])

df3 = pd.DataFrame([[150,57,110,20,10],
                    [120,66,110,20,0],
                    [90,40,105,20,0],
                    [60,40,90,20,0]],
                    columns= ['GH_1', 'GH_2', 'GH_3', 'GT_1', 'GT_2'])

updates = df3.iloc[-1].values
df1["p_mw"] = updates[:3]
df2["p_mw"] = np.append(updates[3:], df2["p_mw"].iloc[-1])

Upvotes: 0

Related Questions