2

i want to replace all rows that have "A" in name column with single row from another df

i got this

data={"col1":[2,3,4,5,7],
"col2":[4,2,4,6,4],
"col3":[7,6,9,11,2],
"col4":[14,11,22,8,5],
"name":["A","A","V","A","B"],
"n_roll":[8,2,1,3,9]}
df=pd.DataFrame.from_dict(data)
df

that is my single row (the another df)

data2={"col1":[0]
     ,"col2":[1]
     ,"col3":[5]
     ,"col4":[6]
             }
df2=pd.DataFrame.from_dict(data2)
df2

that how i want it to look like

data={"col1":[0,0,4,0,7],
"col2":[1,1,4,1,4],
"col3":[5,5,9,5,2],
"col4":[6,6,22,6,5],
"name":["A","A","V","A","B"],
"n_roll":[8,2,1,3,9]}
df=pd.DataFrame.from_dict(data)
df

i try do this df.loc[df["name"]=="A"][df2.columns]=df2 but it did not work

2 Answers 2

4

We can try mask + combine_first

df = df.mask(df['name'].eq('A'), df2.loc[0], axis=1).combine_first(df)
df
   col1  col2  col3  col4 name  n_roll
0     0     1     5     6    A     8.0
1     0     1     5     6    A     2.0
2     4     4     9    22    V     1.0
3     0     1     5     6    A     3.0
4     7     4     2     5    B     9.0
Sign up to request clarification or add additional context in comments.

Comments

2

df.loc[df["name"]=="A"][df2.columns]=df2 is index-chaining and is not expected to work. For details, see the doc.

You can also use boolean indexing like this:

df.loc[df['name']=='A', df2.columns] = df2.values

Output:

   col1  col2  col3  col4 name  n_roll
0     0     1     5     6    A       8
1     0     1     5     6    A       2
2     4     4     9    22    V       1
3     0     1     5     6    A       3
4     7     4     2     5    B       9

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.