具有不同列和行索引的两个 DataFrame 的联合更新现有值 - Pandas
Union of two DataFrames with different column and row indexes updating existing values - Pandas
首先我会举一个我想要得到的结果的例子。我最初有两个 DataFrame,通常具有不同的列索引和行索引,最终具有不同的行数和列数(即使在下面的示例中都是 3x3):
Dataframe1 | Dataframe2
A B C | B D F
A x x x | A y y y
D x x x | B y y y
E x x x | E y y y
我想要以下结果:
Result
A B C D F
A x y x y y
B - y - y y
D x x x - -
E x y x y y
请注意该解决方案具有以下特征:
- 生成的数据框包含
dataframe1
和 dataframe2
的所有行和列
- 在值重叠的地方,
dataframe2
更新 dataframe1
(例如,在结果数据框的 [BA] 和 [BE] 位置,在 dataframe1
的相同位置有 x
,现在有 y
)
- 在出现缺失值的地方(此处用破折号
-
代替)插入默认值(如 NaN
)
- 索引名称保留在结果中table(但不需要按字母顺序排序)
我的问题是:
- 是否可以用 pandas 做到这一点?如果是,如何?我尝试了很多不同的方法,但 none 其中 100% 有效,但由于我是 pandas 的新手,我可能不知道正确的方法。
- 如果 pandas 不是正确或最简单的方法,您是否可以推荐另一种方法(可能使用矩阵、字典等)
谢谢。
试试这个:
data1 = {'A': {'A': 'x', 'D': 'x', 'E': 'x'},
'B': {'A': 'x', 'D': 'x', 'E': 'x'},
'C': {'A': 'x', 'D': 'x', 'E': 'x'}}
df1 = pd.DataFrame(data1)
print(df1)
>>>
A B C
A x x x
D x x x
E x x x
data2 = {'B': {'A': 'y', 'B': 'y', 'E': 'y'},
'D': {'A': 'y', 'B': 'y', 'E': 'y'},
'F': {'A': 'y', 'B': 'y', 'E': 'y'}}
df2 = pd.DataFrame(data2)
print(df2)
>>>
B D F
A y y y
B y y y
E y y y
res = df1.combine_first(df2)
print(res)
>>>
A B C D F
A x y x y y
B NaN y NaN y y
D x x x NaN NaN
E x y x y y
试试另一个:
cols = df1.columns.append(df2.columns).unique().sort_values()
idx = df1.index.append(df2.index).unique().sort_values()
res = df1.reindex(index=idx, columns=cols)
res.update(df2)
print(res)
>>>
A B C D F
A x y x y y
B NaN y NaN y y
D x x x NaN NaN
E x y x y y
首先我会举一个我想要得到的结果的例子。我最初有两个 DataFrame,通常具有不同的列索引和行索引,最终具有不同的行数和列数(即使在下面的示例中都是 3x3):
Dataframe1 | Dataframe2
A B C | B D F
A x x x | A y y y
D x x x | B y y y
E x x x | E y y y
我想要以下结果:
Result
A B C D F
A x y x y y
B - y - y y
D x x x - -
E x y x y y
请注意该解决方案具有以下特征:
- 生成的数据框包含
dataframe1
和dataframe2
的所有行和列
- 在值重叠的地方,
dataframe2
更新dataframe1
(例如,在结果数据框的 [BA] 和 [BE] 位置,在dataframe1
的相同位置有x
,现在有y
) - 在出现缺失值的地方(此处用破折号
-
代替)插入默认值(如NaN
) - 索引名称保留在结果中table(但不需要按字母顺序排序)
我的问题是:
- 是否可以用 pandas 做到这一点?如果是,如何?我尝试了很多不同的方法,但 none 其中 100% 有效,但由于我是 pandas 的新手,我可能不知道正确的方法。
- 如果 pandas 不是正确或最简单的方法,您是否可以推荐另一种方法(可能使用矩阵、字典等)
谢谢。
试试这个:
data1 = {'A': {'A': 'x', 'D': 'x', 'E': 'x'},
'B': {'A': 'x', 'D': 'x', 'E': 'x'},
'C': {'A': 'x', 'D': 'x', 'E': 'x'}}
df1 = pd.DataFrame(data1)
print(df1)
>>>
A B C
A x x x
D x x x
E x x x
data2 = {'B': {'A': 'y', 'B': 'y', 'E': 'y'},
'D': {'A': 'y', 'B': 'y', 'E': 'y'},
'F': {'A': 'y', 'B': 'y', 'E': 'y'}}
df2 = pd.DataFrame(data2)
print(df2)
>>>
B D F
A y y y
B y y y
E y y y
res = df1.combine_first(df2)
print(res)
>>>
A B C D F
A x y x y y
B NaN y NaN y y
D x x x NaN NaN
E x y x y y
试试另一个:
cols = df1.columns.append(df2.columns).unique().sort_values()
idx = df1.index.append(df2.index).unique().sort_values()
res = df1.reindex(index=idx, columns=cols)
res.update(df2)
print(res)
>>>
A B C D F
A x y x y y
B NaN y NaN y y
D x x x NaN NaN
E x y x y y