将新行添加到其中尚不存在的数据框中

msa*_*kya 8 python python-2.7 pandas

我有两个dataframes df1df2从同一个源进行了计算的是,但具有不同的方法,从而大部分值是相同的,具有一定的差异.现在,我想df1根据中的值进行更新df2.

例如:

df1 = pd.DataFrame({'name':['john','deb','john','deb'], 'col1':[490,500,425,678], 'col2':[456,625,578,789],'col3':['TN','OK','OK','NY']})
 name col1 col2 col3
 john  490  456  TN
 deb   500  625  OK
 john  425  578  OK
 deb   678  789  NY

df2 = pd.DataFrame({'name':['deb','john','deb','john','deb'], 'col1':[400,490,500,425,678], 'col2':[225,456,625,578,789],'col3':['TN','TN','OK','OK','NY']})
 name col1 col2 col3
  deb  400  225  TN
 john  490  456  TN
  deb  500  625  OK
 john  425  578  OK
 deb   678  789  NY
Run Code Online (Sandbox Code Playgroud)

所以,在这种情况下,.append应该追加仅第一行df2df1.所以,只有当一个新行df2不存在df1(基于名称和col3)时才会添加/更新该列,否则它不会.

这几乎concat应该是应该做的事情.

fir*_*ynx 13

有两种方法可以实现你的结果.

  1. Concat两个数据帧,然后删除重复项
  2. 使用外部联接/合并,然后删除重复项

我会告诉你们两个.

Concat然后下降

这应该更加CPU友好

df3 = pd.concat([df1,df2])
df3.drop_duplicates(subset=['name', 'col3'], inplace=True, keep='last')
Run Code Online (Sandbox Code Playgroud)

此方法可能比外连接更占用内存,因为您持有的时间点df1,df2以及内存中两个[df1, df2](df3)的连接结果.

外连接然后丢弃

这应该更加内存友好.

df3 = df1.merge(df2, on=list(df1), how='outer')
df3.drop_duplicates(subset=['name', 'col3'], inplace=True, keep='last')
Run Code Online (Sandbox Code Playgroud)

进行outer连接将确保您从两个数据帧中获取所有条目,但是df3会比我们使用的情况小concat.

版本0.15及更早版本说明:

keep='last'过去的关键字take_last=True