说我有两个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
答案 0 :(得分:1)
使用set_index
并使用loc
和reset_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