从合并结果中分配熊猫值

时间:2018-11-28 05:20:04

标签: python pandas merge inner-join

说我有两个DataFrame,其中一个在概念上是另一个的子集。如何有效地将数据从子集传输到超集?以下是一些可以使用的数据:

import pandas as pd

sup = pd.DataFrame({'row': [0, 0, 0, 1, 1, 1, 2, 2],
                    'col': [0, 1, 2, 0, 1, 2, 1, 2], 'val': 1.3})
#    col  row  val
# 0    0    0  1.3
# 1    1    0  1.3
# 2    2    0  1.3
# 3    0    1  1.3
# 4    1    1  1.3
# 5    2    1  1.3
# 6    1    2  1.3
# 7    2    2  1.3

sub = pd.DataFrame({'Row': [2, 0, 1], 'Column': [2, 1, 0], 'Value': [1.1, 4.4, 2.4]})
#    Column  Row  Value
# 0       2    2    1.1
# 1       1    0    4.4
# 2       0    1    2.4

我知道我可以有效地merge两个数据框:

sup.merge(sub, left_on=['row', 'col'], right_on=['Row', 'Column'])
#    col  row  val  Column  Row  Value
# 0    1    0  1.3       1    0    4.4
# 1    0    1  1.3       0    1    2.4
# 2    2    2  1.3       2    2    1.1

但是如何用sup['val']中的值覆盖sub['Value']中的值?在我的实际情况下,sup大约有4万行,而sub只有1000列。

在此示例中期望的结果将是:

#    col  row  val
# 0    0    0  1.3
# 1    1    0  4.4
# 2    2    0  1.3
# 3    0    1  2.4
# 4    1    1  1.3
# 5    2    1  1.3
# 6    1    2  1.3
# 7    2    2  1.1

1 个答案:

答案 0 :(得分:1)

使用set_index并使用locreset_index更改值,而且您无需在此处合并:

sub.rename(columns={'Row':'row', 'Column':'col', 'Value':'val'}, inplace=True)
#alternative sub.columns = sup.columns
sub.set_index(['row','col'], inplace=True)
sup.set_index(['row','col'], inplace=True)
sup.loc[sub.index,:] = sub['val']
sup.reset_index(inplace=True)

print(sup)
   row  col  val
0    0    0  1.3
1    0    1  4.4
2    0    2  1.3
3    1    0  2.4
4    1    1  1.3
5    1    2  1.3
6    2    1  1.3
7    2    2  1.1