更新并合并pandas dataframe

时间:2018-06-01 06:36:15

标签: python pandas dataframe algorithmic-trading

我有一个专栏' A'在两个数据帧中,比如df1和df2。

DF1:

|  ID  | A |  |
|------|---|--|
| ID1  | 5 |  |
| ID2  | 6 |  |
| ID3  | 7 |  |
| ID4  | 8 |  |

df2:

|  ID  | A |  |
|------|---|--|
| ID1  | 5 |  |
| ID2  | 1 |  |
| ID3  | 8 |  |
| ID5  | 7 |  |
| ID6  | 8 |  |
| ID7  | 9 |  |

必需更新的df1:

|  ID  | A |  |
|------|---|--|
| ID1  | 5 |  |
| ID2  | 1 |  |
| ID3  | 8 |  |
| ID4  | 8 |  |
| ID5  | 7 |  |
| ID6  | 8 |  |
| ID7  | 9 |  |

我想更新专栏' A'在df1中,如果ID在df2中,则来自df2的值,否则我想在df1中保持相同的值。此外,如果df2中有新ID,我想在df1中添加新值。

我已经看过pd.DataFrame.update的文档,它确实将df2中的值更新为df1,但它没有将新值添加到df1。任何帮助将不胜感激。提前致谢。

2 个答案:

答案 0 :(得分:1)

我认为需要:

df = pd.concat([df1, df2]).drop_duplicates(subset=['ID'], keep='last').sort_values('ID')
print (df)
    ID  A
0  ID1  5
1  ID2  1
2  ID3  8
3  ID4  8
3  ID5  7
4  ID6  8
5  ID7  9

<强>解释

首先concat DataFrame一起:

print (pd.concat([df1, df2]))
    ID  A
0  ID1  5
1  ID2  6
2  ID3  7
3  ID4  8
0  ID1  5
1  ID2  1
2  ID3  8
3  ID5  7
4  ID6  8
5  ID7  9

由于创建了相同的ID,因此请按drop_duplicates删除重复项,并保留最后一个值:

print (pd.concat([df1, df2]).drop_duplicates(subset=['ID'], keep='last'))
    ID  A
3  ID4  8
0  ID1  5
1  ID2  1
2  ID3  8
3  ID5  7
4  ID6  8
5  ID7  9

最后按IDsort_values排序。

答案 1 :(得分:0)

您可以使用Pandas的merge方法来做同样的事情。

您可以使用合并功能合并df1和df2,如下所示:

df = pd.merge(df2,df1, how ='outer')

在这里,我正在将df2与df1合并。外部使用来自两个数据帧的键并集。 Union将从df2中获取所有密钥,而仅从df1中获取那些在df2中不可用的密钥。

enter image description here

第二步是删除考虑ID列的重复行。

df = df.drop_duplicates(subset=['ID'],keep='first')

这将删除列ID中的所有重复行,但第一次出现的行除外。

enter image description here

第三步是对考虑ID列的行进行排序。

df =df.sort_values('ID')

enter image description here