如何用另一个数据框替换部分数据框

时间:2020-10-09 08:47:55

标签: python pandas dataframe

我有两个数据帧,我想过滤数据并将df1中的列列表替换为df2中的相同列

我想用df1.loc[df1["name"]=="A"]过滤此df

first_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]}
df1=pd.DataFrame.from_dict(first_data)

并在name =“ A”时放置列[“ col1”,“ col2”,“ n_roll”] 在df2中的相同位置(在相同的索引上)

sec_df={"col1":[55,0,57,1,3],
"col2":[55,0,4,4,53],
"col3":[55,33,9,0,2],
"col4":[55,0,22,4,5],
"name":["A","A","V","A","B"],
"n_roll":[8,2,1,3,9]}
df2=pd.DataFrame.from_dict(sec_df)

如果我把cols = [col1,col2,col3,col4]的列表放进去

所以我喜欢这个

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

2 个答案:

答案 0 :(得分:1)

  1. 您可以使用双combine_first
  2. 使用df2组合df1的过滤版本
  3. 但是,在df1的过滤版本中排除的列被留下,并且您拥有NaN值。但是,没关系-只需在combine_first上再做一个df2即可获得这些值!

(df1.loc[df1['name'] != 'A', ["col1","col2","n_roll"]]
 .combine_first(df2)
 .combine_first(df2))
Out[1]: 
   col1  col2  col3  col4  n_roll name
0  55.0  55.0  55.0  55.0     8.0    A
1   0.0   0.0  33.0   0.0     2.0    A
2   4.0   4.0   9.0  22.0     1.0    V
3   1.0   4.0   0.0   4.0     3.0    A
4   7.0   4.0   2.0   5.0     9.0    B

答案 1 :(得分:1)

只用一条线就能达到这个人!

df1=df1[df1.name!='A'].append(df2[df2.name=='A'].rename(columns={'hight':'n_roll'})).sort_index()



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

工作方式

d=df1[df1.name!='A']#selects df1 where name is not A

df2[df2.name=='A']#selects df where name is A

e=df2[df2.name=='A'].rename(columns={'hight':'n_roll'})#renames column height to allow appending

d.append(e)# combines the dataframes

d.append(e).sort_index()#sorts the index