matan
matan

Reputation: 461

how to replace rows by row with condition

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

Upvotes: 2

Views: 438

Answers (2)

Quang Hoang
Quang Hoang

Reputation: 150735

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

Upvotes: 2

BENY
BENY

Reputation: 323226

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

Upvotes: 4

Related Questions