更新和合并 pandas 数据框中的列
updating and merging a column in pandas dataframe
我在两个数据框中有一列 '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 | |
如果 ID 在 df2 中,我想用 df2 中的值更新 df1 中的列 'A',否则我想在 df1 中保留相同的值。此外,如果df2中有新的ID,我想在df1中添加新的值。
我看过 pd.DataFrame.update 的文档,它确实将 df2 的值更新为 df1,但没有将新值添加到 df1。任何帮助将不胜感激。提前致谢。
我认为需要:
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
最后按 ID
按 sort_values
排序。
你可以使用Pandas的合并方法做同样的事情。
您可以使用合并功能合并 df1 和 df2,如下所示:
df = pd.merge(df2,df1, how ='outer')
这里我将 df2 与 df1 合并。外部使用来自两个数据帧的键的并集。 Union 将获取 df2 中的所有密钥,并且仅获取 df1 中 df2 中不可用的那些密钥。
第二步是根据 ID 列删除重复行。
df = df.drop_duplicates(subset=['ID'],keep='first')
这将删除列 ID 中的所有重复行,除了第一个出现的行。
第三步是根据 ID 列对行进行排序。
df =df.sort_values('ID')
我在两个数据框中有一列 '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 | |
如果 ID 在 df2 中,我想用 df2 中的值更新 df1 中的列 'A',否则我想在 df1 中保留相同的值。此外,如果df2中有新的ID,我想在df1中添加新的值。
我看过 pd.DataFrame.update 的文档,它确实将 df2 的值更新为 df1,但没有将新值添加到 df1。任何帮助将不胜感激。提前致谢。
我认为需要:
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
最后按 ID
按 sort_values
排序。
你可以使用Pandas的合并方法做同样的事情。
您可以使用合并功能合并 df1 和 df2,如下所示:
df = pd.merge(df2,df1, how ='outer')
这里我将 df2 与 df1 合并。外部使用来自两个数据帧的键的并集。 Union 将获取 df2 中的所有密钥,并且仅获取 df1 中 df2 中不可用的那些密钥。
第二步是根据 ID 列删除重复行。
df = df.drop_duplicates(subset=['ID'],keep='first')
这将删除列 ID 中的所有重复行,除了第一个出现的行。
第三步是根据 ID 列对行进行排序。
df =df.sort_values('ID')