简体   繁体   English

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

[英]How to replace part of the data-frame with another data-frame

i have two data frames and i like to filter the data and replace list of columns from df1 with the same columns in df2我有两个数据框,我喜欢过滤数据并将 df1 中的列列表替换为 df2 中的相同列

i want to filter this df by df1.loc[df1["name"]=="A"]我想通过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)

and put the columns ["col1","col2","n_roll"] when name="A" on the same places in df2 (on the same indexs)并将列 ["col1","col2","n_roll"] when name="A" 放在 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)

if i put that list of cols=[col1,col2,col3,col4]如果我把 cols=[col1,col2,col3,col4] 列表

so i like to get this所以我喜欢这个

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
  1. You can achieve this with a double combine_first您可以使用双combine_first来实现此目的
  2. Combine a filtered version of df1 with df2将 df1 的过滤版本与 df2 结合
  3. However, the columns that were excluded in the filtered version of df1 were left behind and you have NaN values.但是,在 df1 的过滤版本中被排除的列被留下,并且您有NaN值。 But, that is okay -- Just do another combine_first on df2 to get those values!但是,没关系——只需在df2上再执行一次combine_first即可获得这些值!

(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

Use one line to achieve this man!用一根线成就这个人!

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

How it works怎么运行的

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM